본문 바로가기
프로젝트

[MySQL] MySQL 데이터 타입

by 2245 2024. 1. 16.

목차

     

    데이터 타입 선택 방법

    MySQL은 다양한 데이터 타입을 지원하는데, 데이터에 적합한 데이터 타입을 고르는 것은 좋은 성능을 얻는 데 필수적입니다.

    • 타입은 작을 수록 좋다.

      보통 작은 데이터 타입일수록 디스크나 메모리, CU 캐시에 더 적은 공간을 사용하기 때문에 더 빠르며 덜 소비합니다.
      하지만, 저장할 값의 크기를 너무 작게 추정하지 않도록 주의해야 합니다. 스키마의 이곳저곳에서 데이터 타입의 범위를 늘리는 작업은 어렵고 시간을 많이 소모하기 때문입니다.
    • 타입은 단순한 게 좋다.

      보통 간단한 데이터 타입을 처리할 수록 CPU 사이클을 덜 소비합니다. 
      예를 들어 문자 비교는 문자 셋(Character set)과 콜레이션(Collation)으로 인해 복잡해지므로 문자 비교보다는 정수 비교가 비용이 더 저렴합니다. 날짜와 시간은 문자열로 저장하지 말고, MySQL의 내장 형식에 저장해야 하며, IP 주소는 정수를 이용해 저장해야 합니다. 참고로 IP 주소를 사용할 수 있는 함수로는 INET_ATON 함수와 INET_NTOA 함수가 있습니다. 
    • 가능하면 NULL을 쓰지 말자

      컬럼은 되도록 NOT NULL(NULL 허용 안함)로 정의해야 합니다. NULL 허용 컬럼은 저장 공간을 더 많이 사용하며, NULL 허용 컬럼을 인덱싱할 때 항목마다 한 바이트씩 더 들어갑니다. 
      만약, '값이 없다'라는 데이터 값을 표현하고 싶다면 NULL 대신 0이나 특수한 어떤 값, 빈 문자열 등을 사용하는 걸 고려해봅시다. 

     

    MySQL 데이터 타입

    문자형

    데이터 유형 정의
    CHAR(n) 고정 길이 데이터 타입(최대 255byte) - 지정된 길이보다 짧은 데이터가 입력될 시 나머지 공간을 공백으로 채운다.
    VARCHAR(n) 가변 길이 데이터 타입(최대 65535byte) - 지정된 길이보다 짧은 데이터가 입력될 시 나머지 공간을 채우지 않는다.
    TINYTEXT(n) 문자열 데이터 타입(최대 255byte)
    TEXT(n) 문자열 데이터 타입 (최대 65535byte)
    MEDIUMTEXT(n) 문자열 데이터 타입(최대 16777215byte)
    LONGTEXT(n) 문자열 데이터 타입(최대 4294967295byte)
    JSON JSON 문자열 데이터 타입 - JSON 형태의 포맷을 꼭 준수해야 한다.

     

    • VARCHAR vs TEXT
      • VARCHAR
        • 문자열의 길이가 정해진 경우 또는 상대적으로 작은 문자열을 저장해야 하는 경우에 적합합니다.
        • 인덱스를 지원합니다. 문자열 검색 시 빠르게 조회할 수 있도록 인덱스를 생성할 수 있습니다.
        • 기본값을 설정할 수 있습니다.  
      • TEXT
        • 대용량의 텍스트 데이터를 저장해야 하는 경우에 사용됩니다. 긴 문장, 긴 문서 또는 BLOB(Binary Large OBject) 데이터 등을 저장할 때 유용합니다. 
        • 텍스트 데이터의 길이가 크기 때문에 일반적으로 인덱스를 사용하지 않습니다.
        • 기본값 설정이 어렵습니다.  

     

    숫자형

    데이터 유형 정의
    TINYINT(n) 정수형 데이터 타입(1byte) -128 ~ +127 또는 0 ~ 255 표현
    SMALLINT(n) 정수형 데이터 타입(2byte) -32768 ~ 32767 또는 0 ~ 65536 표현
    MEDIUMINT(n) 정수형 데이터 타입(3byte) -8388608 ~ +8388607 또는 0 ~ 16777215 표현
    INT(n) 정수형 데이터 타입(4byte) -2147483648 ~ +2147483647 또는 0 ~ 4294967295 표현
    BIGINT(n) 정수형 데이터 타입(8byte) - 무제한 수 표현
    FLOAT(길이, 소수) 부동 소수형 데이터 타입(4byte) - 고정 소수점 사용 형태
    DECIMAL(길이, 소수) 고정 소수형 데이터 타입고정(길이+1byte) - 소수점 사용 형태
    DOUBLE(길이, 소수)
    부동 소수형 데이터 타입(8byte) - double을 문자열로 저장

     

     

    날짜형

    데이터 유형 정의
    DATE 날짜(년도, 월, 일) 형태 (3byte)
    TIME 시간(시, 분, 초) 형태 (3byte)
    DATETIME 날짜와 시간 형태 (8byte)
    TIMESTAMP 날짜와 시간 형태 (4byte) - 시스템 변경 시 자동으로 그 날짜와 시간이 저장된다.
    YEAR 년도 표현 (1byte)

     

    • DATETIME vs TIMESTAMP
      • DATETIME
        • 최대값의 제약이 없습니다. 
        • 자동으로 현재 날짜와 시간으로 설정되지 않고, 사용자가 직접 기본값을 설정해야 합니다. 
        • 시간대 정보를 저장하지 않으며, 저장된 값은 데이터베이스 서버의 시간대에 의존합니다. 
      • TIMESTAMP
        • 최대값은 '2038-01-19 03:14:07' 이며, 32비트 시스템에서는 UNIX 타임 스탬프의 최대 값에 해당합니다. 
        • 자동으로 현재 타임스탬프로 설정됩니다. 즉, 기본값이 'CURRENT_TIMESTAMP'로 설정됩니다. 
        • 시간대 정보를 포함할 수 있습니다. 예를 들어, '2023-01-01 12:00:00 +03:00'

     

    이진 데이터

    데이터 유형 정의
    BINARY(n) & BYTE(n) CHAR의 형태의 이진 데이터 타입 (최대 255byte)
    VARBINARY(n) VARCHAR의 형태의 이진 데이터 타입 (최대 65535byte)
    TINYBLOB(n) 이진 데이터 타입 (최대 255byte)
    BLOB(n) 이진 데이터 타입 (최대 65535byte)
    MEDIUMBLOB(n) 이진 데이터 타입 (최대 16777215byte)
    LONGBLOB(n) 이진 데이터 타입 (최대 4294967295byte)

     

     


    참고

    '프로젝트' 카테고리의 다른 글

    [MySQL] MySQL 데이터 타입과 Java 데이터 타입 매칭  (0) 2024.01.16
    [ERD] ERD Cloud 사용법  (0) 2024.01.16