MySQL Data Type
MySQL의 자료형은 크게 다음과 같이 구분할 수 있다.
- 숫자형
- 문자형
- 날짜 및 시간형
- JSON형
- 공간 자료형
목차
1. 숫자형
1.1. 정수형
| 데이터 타입 | 크기 | SIGNED 범위 | UNSIGNED 범위 |
|---|---|---|---|
TINYINT |
1바이트 | -128 ~ 127 | 0 ~ 255 |
SMALLINT |
2바이트 | -32,768 ~ 32,767 | 0 ~ 65,535 |
MEDIUMINT |
3바이트 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
INT, INTEGER |
4바이트 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
BIGINT |
8바이트 | -2^63 ~ 2^63−1 | 0 ~ 2^64−1 |
정수형은 기본적으로 SIGNED이고, 음수가 필요하지 않다면 UNSIGNED를 지정해 양수 범위를 넓힐 수 있다.
1.2. 실수형
실수형은 저장하는 방식에 따라 고정 소수점 방식, 부동 소수점 방식으로 나눠진다.
1.2.1. 고정 소수점
| 데이터 타입 | 저장 크기 | 설명 |
|---|---|---|
DECIMAL(M,D) |
자릿수에 따라 달라짐 | 정확한 고정 소수점 숫자 |
NUMERIC(M,D) |
DECIMAL과 동일 |
DECIMAL의 동의어 |
- M: 전체 자릿수
- D: 소수점 이하 자릿수
- 정수부 자릿수: M-D
- M의 최댓값: 65
- D의 최댓값: 30
- D는 M보다 클 수 없음
- M을 생략하면 기본값은 10
- D를 생략하면 기본값은 0
DECIMAL(M,D)의 범위는 다음과 같이 표현할 수 있다.
예를 들어 DECIMAL(5,2)의 범위는 다음과 같다.
-999.99 ~ 999.99
1.2.2. 부동 소수점
| 데이터 타입 | 크기 | 특징 |
|---|---|---|
FLOAT |
4바이트 | 단정밀도 부동 소수점 |
DOUBLE, DOUBLE PRECISION, REAL |
8바이트 | 배정밀도 부동 소수점 |
부동 소수점형은 값을 근삿값으로 저장한다. 따라서 정확한 값을 찾기 보다는 오차 범위를 사용하는 방식이 적절하다.
FLOAT, DOUBLE 등의 부동 소수점 유형은 MySQL 8.0.17 이후 버전부터 사용되지 않는다.
1.3. BIT형
| 데이터 타입 | 크기 | 설명 |
|---|---|---|
BIT(M) |
약 CEIL(M / 8)바이트 |
1~64개의 비트 저장 |
M을 생략하면 기본값은 1이다.
2. 문자형
2.1. CHAR와 VARCHAR
| 데이터 타입 | 최대 길이 | 저장 방식 | 주요 용도 |
|---|---|---|---|
CHAR(M) |
255문자 | 고정 길이 | 국가 코드, 고정 길이 코드 |
VARCHAR(M) |
최대 65,535바이트의 행 크기 제한 | 가변 길이 | 이름, 이메일, 제목 |
TINYTEXT |
255바이트 | 가변 길이 | 짧은 텍스트 |
TEXT |
65,535바이트 | 가변 길이 | 일반 본문 |
MEDIUMTEXT |
16,777,215바이트 | 가변 길이 | 긴 문서 |
LONGTEXT |
4,294,967,295바이트 | 가변 길이 | 매우 큰 텍스트 |
CHAR(M)은 지정된 길이에 맞춰 오른쪽에 공백을 채워 저장한다. 일반적으로 조회할 때 후행 공백은 제거된다.VARCHAR(M)은 실제 문자열 길이만큼 저장하고, 길이를 나타내는 1~2바이트 정보를 추가한다. 저장 및 조회 시 후행 공백을 유지한다.
2.2. BINARY와 VARBINARY
| 데이터 타입 | 설명 |
|---|---|
BINARY(M) |
고정 길이 바이트 문자열 |
VARBINARY(M) |
가변 길이 바이트 문자열 |
BINARY와 VARBINARY는 바이트 단위로 비교된다.
2.3. TEXT와 BLOB
| 데이터 타입 | 텍스트 | 바이너리 | 최대 크기 |
|---|---|---|---|
| Tiny | TINYTEXT |
TINYBLOB |
255바이트 |
| 일반 | TEXT |
BLOB |
65,535바이트 |
| Medium | MEDIUMTEXT |
MEDIUMBLOB |
16,777,215바이트 |
| Long | LONGTEXT |
LONGBLOB |
4,294,967,295바이트 |
TEXT: 문자 데이터 저장BLOB: 바이너리 데이터 저장TEXT는 문자 집합과 Collation의 영향을 받음BLOB은 바이트 값으로 비교- 저장 크기는 실제 데이터 크기와 길이 정보에 따라 결정됨
TEXT와 BLOB에 인덱스를 생성할 때는 보통 인덱스 접두 길이를 지정해야 한다.
2.4. ENUM과 SET
| 데이터 타입 | 설명 | 제한 |
|---|---|---|
ENUM |
목록 중 하나의 값 선택 | 최대 65,535개 |
SET |
목록 중 여러 값 선택 | 최대 64개 |
ENUM: 값 종류가 자주 변경되거나 별도 속성이 필요하다면 참조 테이블을 사용하는 것이 유용하다.SET: RDBMS 정규화 관점에서는 다대다 관계 테이블로 분리하는 방식이 일반적으로 관리하기 쉽다.
3. 날짜 및 시간
| 데이터 타입 | 기본 크기 | 표현 범위 | 설명 |
|---|---|---|---|
DATE |
3바이트 | 1000-01-01 ~ 9999-12-31 | 날짜 |
DATETIME |
5바이트 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 날짜와 시간 |
TIMESTAMP |
4바이트 | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | Unix Epoch 기반 날짜와 시간 |
TIME |
3바이트 | -838:59:59 ~ 838:59:59 | 시각 또는 시간 간격 |
YEAR |
1바이트 | 1901 ~ 2155 및 0000 | 연도 |
MySQL 5.6.4 이후 DATETIME의 기본 저장 크기는 8바이트가 아니라 5바이트다.
YEAR(2) 와 같이 두 자리로 표기하는 데이터 유형은 MySQL 5.7 이후 버전부터 지원하지 않는다.
YEAR(4) 와 같이 명시적인 길이를 표기한 데이터 유형은 MySQL 8.0.19 이후 버전부터 사용되지 않는다.
3.1. DATETIME과 TIMESTAMP의 차이
| 구분 | DATETIME |
TIMESTAMP |
|---|---|---|
| 기본 크기 | 5바이트 | 4바이트 |
| 표현 범위 | 1000년~9999년 | 1970년~2038년 |
| 시간대 변환 | 수행하지 않음 | 세션 시간대에 따라 변환 |
| 주요 용도 | 예약일, 생년월일, 현지 시각 | 생성·수정 시각, 시스템 이벤트 |
TIMESTAMP는 UTC 기준으로 저장되고, 저장하거나 조회할 때 현재 세션의 시간대에 따라 변환된다. 반면 DATETIME은 입력된 날짜와 시간을 그대로 저장한다.
4. JSON형
MySQL은 네이티브 JSON 자료형을 지원한다.
JSON 자료형의 주요 특징은 다음과 같다.
- 저장 시 JSON 문법 자동 검증
- 내부적으로 최적화된 바이너리 형식 사용
- JSON 경로를 이용한 검색 및 수정 지원
- 객체, 배열, 문자열, 숫자, Boolean,
null저장 가능 - 일반 인덱스를 JSON 열 자체에 직접 생성하기보다 생성 열 또는 다중값 인덱스를 활용
5. 공간 자료형
MySQL은 위치와 도형 정보를 저장하는 공간 자료형을 지원한다.
| 데이터 타입 | 설명 |
|---|---|
GEOMETRY |
모든 공간 객체의 기본 자료형 |
POINT |
하나의 좌표 |
LINESTRING |
여러 점을 연결한 선 |
POLYGON |
다각형 영역 |
MULTIPOINT |
여러 점 |
MULTILINESTRING |
여러 선 |
MULTIPOLYGON |
여러 다각형 |
GEOMETRYCOLLECTION |
여러 종류의 공간 객체 집합 |
Comments