SQL에서는 문자 데이터를 다양하게 저장하기 위해 여러 문자열 타입(String Types)을 제공합니다. 이 글에서는 CHAR, VARCHAR, TEXT, ENUM, SET 등 자주 쓰이는 문자열 타입의 특징과 차이점을 비교하고, 실제 예제를 통해 그 활용 방법을 자세히 소개합니다.
1. CHAR와 VARCHAR
CHAR(M): 고정 길이 문자열
- 지정한 길이(M)에 맞춰 공백으로 채움
- 데이터 크기가 일정해야 할 때 유리
- 예:
'ab' → 'ab ' (M이 4일 때)
VARCHAR(M): 가변 길이 문자열
- 실제 입력된 문자 길이만큼 저장
- 저장 공간 효율적, 일반 텍스트에 적합
- 예:
'ab' → 'ab'
문법
CHAR(M) -- 최대 255자
VARCHAR(M) -- 최대 65,535자 (단, 행 전체 크기 제한 있음)
예제 비교
ALTER TABLE Reservation ADD Note CHAR(4);
INSERT INTO Reservation(Note) VALUES('ab'); -- 저장: 'ab '
ALTER TABLE Reservation MODIFY COLUMN Note VARCHAR(4);
INSERT INTO Reservation(Note) VALUES('ab'); -- 저장: 'ab'
| 입력값 |
CHAR(4) 저장 |
VARCHAR(4) 저장 |
' ' |
' ' |
'' |
'ab' |
'ab ' |
'ab' |
'abcd' |
'abcd' |
'abcd' |
'abcdefgh' |
'abcd' |
'abcd' |
2. BINARY와 VARBINARY
- 이진 데이터(0과 1로 구성된 데이터)를 저장할 때 사용합니다.
- BINARY(M): 고정 길이
- VARBINARY(M): 가변 길이
- 문자 인코딩은 적용되지 않으며, 순수한 바이너리 값으로 저장됩니다.
ALTER TABLE Reservation ADD Data BINARY(8);
3. BLOB과 TEXT
BLOB (Binary Large Object)
- 바이너리 데이터 저장용
- 대소문자 구분 없음
- 이미지, 파일 등 저장에 적합
TEXT
- 텍스트 데이터 저장용
- 대소문자 구분 O
- 긴 설명글, 코멘트 등에 적합
크기 비교
| 타입 |
최대 크기 |
| TINYTEXT |
255 bytes |
| TEXT |
65,535 bytes |
| MEDIUMTEXT |
16 MB |
| LONGTEXT |
4 GB |
ALTER TABLE Reservation ADD Note TEXT;
INSERT INTO Reservation(Note) VALUES('MySQL 자료형 수업입니다.');
4. ENUM
미리 정의된 값 중 하나만 저장 가능한 문자열 타입입니다.
특징
- 최대 65,535개의 값 지정 가능
- 내부적으로 정수로 저장됨 (1부터 시작)
- 잘못된 값 입력 시
''(빈 문자열)로 저장
문법 및 예제
ALTER TABLE Reservation ADD RoomType ENUM('Single', 'Twin', 'Double', 'Triple');
INSERT INTO Reservation(RoomType) VALUES('Single'); -- 'Single'
INSERT INTO Reservation(RoomType) VALUES(2); -- 'Twin'
| 입력값 |
저장값 |
| ‘Single’ |
‘Single’ |
| 2 |
‘Twin’ |
5. SET
미리 정의된 값 중 여러 개를 동시에 저장할 수 있는 문자열 타입입니다.
특징
- 최대 64개의 항목 지정 가능
- 쉼표로 구분하여 여러 값을 입력 가능
문법 및 예제
ALTER TABLE Reservation ADD Request SET('Breakfast', 'Extra Bed', 'Non-Smoking');
INSERT INTO Reservation(Request) VALUES('Breakfast,Extra Bed');
| 입력값 |
저장값 |
| ‘Breakfast,Extra Bed’ |
‘Breakfast,Extra Bed’ |
6. 문자열 타입 요약 정리
| 타입 |
특징 |
사용 사례 |
| CHAR |
고정 길이 문자열, 공백으로 채움 |
고정 길이 코드 (예: 우편번호) |
| VARCHAR |
가변 길이 문자열 |
이름, 이메일, 메모 등 |
| BINARY |
고정 길이 이진 데이터 |
해시, 고정 바이너리 값 |
| VARBINARY |
가변 길이 이진 데이터 |
가변 길이 바이너리 값 |
| BLOB |
바이너리 대용량, 대소문자 무시 |
이미지, 파일 데이터 |
| TEXT |
텍스트 대용량, 대소문자 구분 |
긴 설명글, 게시글 내용 등 |
| ENUM |
미리 정의된 하나의 값만 선택 |
상태, 카테고리 |
| SET |
미리 정의된 여러 값 선택 가능 |
다중 옵션 선택 (서비스 요청 등) |
질문 정리
- VARCHAR보다 CHAR가 좋은 경우는 언제인가요?
- 저장하는 문자열 길이가 항상 일정할 경우(예: 전화번호, 우편번호), CHAR가 더 빠르고 효율적일 수 있습니다.
- VARCHAR는 왜 행 전체 크기에 제한이 있나요?
- MySQL의 최대 행 크기는 약 65,535바이트이므로, VARCHAR의 길이는 다른 필드와 합쳐서 이 제한을 초과하지 않아야 합니다.
- ENUM은 자유도가 너무 낮지 않나요?
- 자주 바뀌지 않는 고정 값 목록에 적합합니다. 예:
'대기', '처리 중', '완료'
- TEXT와 VARCHAR의 차이는 뭔가요?
TEXT는 BLOB 계열로 처리되며, VARCHAR보다 인덱싱이나 정렬에서 제한이 있을 수 있습니다.
- SET은 어떤 경우에 사용하나요?
- 하나의 필드에 여러 값을 저장해야 하는 경우 (예: 회원 취미, 서비스 요청사항 등)
댓글남기기