MySQL 데이터 타입
MySQL 에는 다음과 같은 데이터 타입이 있습니다.
| 데이터 타입 | 설명 |
|---|---|
| CHAR | 고정 길이 문자열 |
| VARCHAR | 가변 길이 문자열 |
| ENUM | 열거형 |
| SET | 집합 |
| TEXT | 텍스트 |
| BLOB | 바이너리 데이터 |
| DATE | 날짜 |
| INT | 정수 |
| BOOLEAN | 불리언 |
| DECIMAL | 고정 소수점 |
| FLOAT | 부동소수점 |
| TIMESTAMP | 날짜와 시간 |
| DATETIME | 날짜와 시간 |
CHAR
CHAR 는 고정 길이 문자열을 저장하는 데이터 타입입니다.
최대 255자까지 저장할 수 있습니다.
CREATE TABLE movies (
title CHAR(10)
);title 이 만약 10글자보다 적은 경우에는 공백으로 빈자리를 채웁니다.
VARCHAR
VARCHAR는 가변 길이 문자열을 저장하는 데이터 타입입니다.
CREATE TABLE movies (
contents VARCHAR(100)
);CHAR 와 다르게 contents 가 100글자보다 적은 경우에는 빈 공간을 공백으로 채우지 않고, contents 의 길이만큼만 저장합니다.
ENUM
ENUM 은 열거형을 저장하는 데이터 타입입니다.
CREATE TABLE movies (
rating ENUM('G', 'PG', 'R')
);rating 은 G, PG, R 중 하나의 값만 저장할 수 있습니다.
SET
MySQL 의 SET 데이터타입은 미리 정의된 값들의 집합에서 0개 이상의 값을 선택할 수 있는 문자열 객체입니다.
SET 은 ENUM 과 유사하지만, ENUM이 하나의 값만 선택할 수 있는 반면 SET 은 여러 개의 값을 동시에 선택할 수 있습니다. 내부적으로는 비트마스크를 사용하여 각 값을 저장합니다.
CREATE TABLE user_interests (
hobbies SET('reading', 'sports', 'music', 'travel', 'cooking')
);hobbies 는 reading, sports, music, travel, cooking 중 하나 또는 여러 개의 값을 저장할 수 있습니다.
TEXT
TEXT 는 텍스트를 저장하는 데이터 타입입니다.
TEXT 타입은 또 종류가 나뉩니다. 아래와 같이 총 4가지가 있습니다.
| 데이터 타입 | 설명 |
|---|---|
| TINYTEXT | 최대 255자 |
| TEXT | 최대 65,535자 |
| MEDIUMTEXT | 최대 16,777,215자 |
| LONGTEXT | 최대 4,294,967,295자 |
근데 위 종류를 보면 그냥 LONGTEXT를 사용하면 되지 않나? 라는 의문이 들 수 있습니다.
그러나 데이터베이스가 처리하는 방식의 차이때문에 (성능과 관련) 최대한 용도에 맞는 타입 설정이 중요합니다.
BLOB
BLOB (Binary Large Object) 데이터타입은 이진 데이터를 저장하기 위한 데이터타입입니다.
MySQL은 크기에 따라 4가지 BLOB 타입을 제공합니다.
| 데이터 타입 | 최대 길이 |
|---|---|
| TINYBLOB | 255 bytes |
| BLOB | 65,535 bytes (64KB) |
| MEDIUMBLOB | 16,777,215 bytes (16MB) |
| LONGBLOB | 4,294,967,295 bytes (4GB) |
INT
INT 는 정수를 저장하는 데이터 타입입니다.
크기에 따라 5가지 정수형 타입을 제공합니다.
| 데이터 타입 | 바이트 | 범위(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 | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
| BIGINT | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 |
column_name INT
column_name INT UNSIGNED기본적으로 위와 같이 사용하는데, 기본값은 SIGNED 입니다.
BOOLEAN
MySQL에서 BOOLEAN은 실제로는 TINYINT(1)의 별칭입니다.
진정한 불린 타입이 아닌 정수 타입으로 구현되어 있습니다.
TRUE, FALSE 대신 1, 0을 사용합니다.
-- 모두 동일한 의미
column_name BOOLEAN
column_name BOOL
column_name TINYINT(1)DECIMAL
DECIMAL 은 고정소수점(Fixed-Point) 숫자를 정확하게 저장하는 데이터타입입니다.
부동소수점과 달리 정확한 계산이 가능하여 금융 데이터나 정밀한 수치 계산에 필수적입니다.
-- 다양한 DECIMAL 정의
CREATE TABLE decimal_examples (
id INT PRIMARY KEY,
price DECIMAL(10,2), -- 99999999.99까지 (총 10자리, 소수점 2자리)
percentage DECIMAL(5,4), -- 9.9999까지 (총 5자리, 소수점 4자리)
huge_number DECIMAL(65,30), -- 최대 크기
simple_decimal DECIMAL -- DECIMAL(10,0)과 동일
);FLOAT
FLOAT는 부동소수점(Floating-Point) 숫자를 저장하는 데이터타입입니다.
IEEE 754 표준을 따르며, 매우 큰 범위의 수를 근사치로 저장할 수 있지만 정확도에 제한이 있습니다.
-- 단정밀도 부동소수점
FLOAT -- 4바이트, 약 7자리 정밀도
FLOAT(p) -- p는 정밀도 (0-24: FLOAT, 25-53: DOUBLE)
-- 배정밀도 부동소수점
DOUBLE -- 8바이트, 약 15자리 정밀도
DOUBLE PRECISION -- DOUBLE과 동일
REAL -- DOUBLE의 별칭 (sql_mode에 따라 FLOAT일 수도 있음)| 데이터 타입 | 바이트 | 범위 | 정밀도 |
|---|---|---|---|
| FLOAT | 4 | ±1.175494351E-38 ~ ±3.402823466E+38 | 약 7자리 |
| DOUBLE | 8 | ±2.2250738585072014E-308 ~ ±1.7976931348623157E+308 | 약 15자리 |
TIMESTAMP, DATETIME
TIMESTAMP 와 DATETIME 은 날짜와 시간을 저장하는 데이터 타입입니다.
| 특성 | TIMESTAMP | DATETIME |
|---|---|---|
| 저장 공간 | 4바이트 | 8바이트 |
| 범위 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 UTC | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
| 시간대 처리 | UTC로 저장, 조회시 변환 | 입력값 그대로 저장 |
| 자동 업데이트 | 지원 | 지원 (MySQL 5.6+) |
-- TIMESTAMP 선언
column_name TIMESTAMP [DEFAULT value] [ON UPDATE CURRENT_TIMESTAMP]
-- DATETIME 선언
column_name DATETIME [DEFAULT value] [ON UPDATE CURRENT_TIMESTAMP]
-- 마이크로초 지원 (MySQL 5.6+)
column_name TIMESTAMP(6) -- 마이크로초까지
column_name DATETIME(3) -- 밀리초까지
그럼 각각을 언제 써야하나요?
- DATETIME : 1000년부터 9999년 사이의 날짜를 저장하고 싶으면 사용
- TIMESTAMP : 시스템 이벤트 저장 시 사용하기 적절 (타임존 고려, 저장공간도 DATETIME에 비하여 덜 차지)
외에도 DATE, TIME, YEAR 도 있습니다.
DATE, TIME, YEAR
- DATE : 날짜를 저장하고 싶으면 사용
- TIME : 시간을 저장하고 싶으면 사용
- YEAR : 년도를 저장하고 싶으면 사용
column_name DATE
column_name TIME
column_name YEAR외에도 JSON, GEOMETRY, ENUM, SET 등 다양한 데이터 타입이 있습니다.
자세한 내용은 MySQL 공식 문서를 참고해주세요.
