MySQL은 다양한 데이터 유형을 제공하며, 이를 크게 숫자형(Numeric), 날짜·시간형(Date and Time), 문자열(String) 세 가지 그룹으로 분류합니다. 각 그룹별 주요 유형과 특징을 자세히 살펴보겠습니다.
1. 숫자형(NUMERIC) 데이터 유형
MySQL은 표준 ANSI SQL 숫자 데이터 유형을 모두 지원합니다. 따라서 다른 데이터베이스 시스템에서 MySQL로 넘어온 개발자라면 익숙하게 사용할 수 있습니다.
정수 유형
아래 정수 유형은 모두 부호 있는(SIGNED) 값과 부호 없는(UNSIGNED) 값으로 선언할 수 있습니다. UNSIGNED로 선언하면 음수를 저장할 수 없는 대신 양수 표현 범위가 두 배로 넓어집니다.
| 유형 | SIGNED 범위 | UNSIGNED 범위 | 최대 표시 폭 |
|---|---|---|---|
| TINYINT | -128 ~ 127 | 0 ~ 255 | 4자리 |
| SMALLINT | -32,768 ~ 32,767 | 0 ~ 65,535 | 5자리 |
| MEDIUMINT | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 9자리 |
| INT | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 11자리 |
| BIGINT | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 | 20자리 |
실수 유형
- FLOAT(M,D) – 단정밀도 부동소수점 수로, UNSIGNED로 선언할 수 없습니다. 표시 길이(M)와 소수 자릿수(D)를 지정할 수 있으며, 생략하면 기본값 10,2가 적용됩니다(전체 10자리 중 소수점 아래 2자리). FLOAT의 소수 정밀도는 최대 24자리입니다.
- DOUBLE(M,D) – 배정밀도 부동소수점 수로, 역시 UNSIGNED로 선언할 수 없습니다. M과 D를 지정할 수 있으며 기본값은 16,4입니다. 소수 정밀도는 최대 53자리까지 가능합니다. REAL은 DOUBLE의 동의어입니다.
- DECIMAL(M,D) – 언팩(unpacked) 방식의 소수로, UNSIGNED로 선언할 수 없습니다. 언팩 방식에서는 소수 자릿수 하나당 1바이트를 사용합니다. M과 D 지정은 필수입니다. NUMERIC은 DECIMAL의 동의어입니다.
2. 날짜 및 시간(DATE AND TIME) 유형
MySQL에서 제공하는 날짜·시간 데이터 유형은 다음과 같습니다.
- DATE – 1000-01-01부터 9999-12-31까지의 날짜를 저장합니다. 기본 형식은 'YYYY-MM-DD'이며, 예를 들어 1984년 1월 17일은 1984-01-17로 저장됩니다.
- DATETIME – 1000-01-01 00:00:00부터 9999-12-31 23:59:59까지의 날짜와 시간을 함께 저장합니다. 기본 형식은 'YYYY-MM-DD HH:MM:SS'이며, 예를 들어 1984년 1월 17일 오후 2시 20분은 1984-01-17 14:20:00으로 저장됩니다.
- TIMESTAMP – '1970-01-01 00:00:01'부터 '2038-01-19 08:44:07'까지의 날짜와 시간을 지원합니다. 사용 방법은 DATETIME과 유사하지만 저장 범위가 더 좁습니다.
- TIME – 시간을 'HH:MM:SS' 형식으로 저장합니다.
- YEAR(M) – 연도를 2자리 또는 4자리 형식으로 저장합니다. YEAR(2)로 지정하면 1970~2069년(70~69), YEAR(4)로 지정하면 1901~2155년을 나타낼 수 있습니다. 기본 길이는 4입니다.
3. 문자열(STRING) 유형
숫자나 날짜 유형도 유용하지만, 실제로 저장하는 대부분의 데이터는 문자열 형태입니다. MySQL에서 자주 사용되는 문자열 데이터 유형은 다음과 같습니다.
- CHAR(M) – 1~255자의 고정 길이 문자열입니다(예: CHAR(5)). 저장 시 지정된 길이보다 짧으면 오른쪽을 공백으로 채웁니다. 길이 지정은 필수가 아니며, 기본값은 1입니다.
- VARCHAR(M) – 1~65,535자의 가변 길이 문자열입니다(예: VARCHAR(25)). VARCHAR 필드를 생성할 때는 반드시 길이를 지정해야 합니다.
- BLOB / TEXT – 최대 65,535자까지 저장할 수 있는 필드입니다. BLOB(Binary Large Object)은 이미지나 각종 파일처럼 대량의 바이너리 데이터를 저장하는 데 사용됩니다. 두 유형의 차이는 정렬·비교 시 BLOB은 대소문자를 구분하고 TEXT는 구분하지 않는다는 점입니다. 길이는 지정하지 않습니다.
- TINYBLOB / TINYTEXT – 최대 255자까지 저장할 수 있는 BLOB/TEXT 컬럼입니다. 길이는 지정하지 않습니다.
- MEDIUMBLOB / MEDIUMTEXT – 최대 16,777,215자까지 저장할 수 있는 BLOB/TEXT 컬럼입니다. 길이는 지정하지 않습니다.
- LONGBLOB / LONGTEXT – 최대 4,294,967,295자까지 저장할 수 있는 BLOB/TEXT 컬럼입니다. 길이는 지정하지 않습니다.
- ENUM – 열거형으로, 미리 정의한 목록에서 값을 선택해야 하는 유형입니다(NULL 허용 가능). 예를 들어 필드에 'A', 'B', 'C' 중 하나만 입력되길 원한다면 ENUM('A','B','C')로 정의하며, 이후 이 필드에는 해당 값들(또는 NULL)만 저장될 수 있습니다.
마무리
데이터 유형을 올바르게 선택하면 저장 공간을 절약하고 쿼리 성능도 향상시킬 수 있습니다. 저장할 값의 범위와 성격(정수/실수, 날짜/시간, 텍스트/바이너리)을 먼저 파악한 뒤, 해당 값들을 충분히 담을 수 있는 가장 작은 유형을 선택하는 것이 좋습니다.