2 분 소요

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 미리 정의된 여러 값 선택 가능 다중 옵션 선택 (서비스 요청 등)

질문 정리

  1. VARCHAR보다 CHAR가 좋은 경우는 언제인가요?
    • 저장하는 문자열 길이가 항상 일정할 경우(예: 전화번호, 우편번호), CHAR가 더 빠르고 효율적일 수 있습니다.
  2. VARCHAR는 왜 행 전체 크기에 제한이 있나요?
    • MySQL의 최대 행 크기는 약 65,535바이트이므로, VARCHAR의 길이는 다른 필드와 합쳐서 이 제한을 초과하지 않아야 합니다.
  3. ENUM은 자유도가 너무 낮지 않나요?
    • 자주 바뀌지 않는 고정 값 목록에 적합합니다. 예: '대기', '처리 중', '완료'
  4. TEXT와 VARCHAR의 차이는 뭔가요?
    • TEXT는 BLOB 계열로 처리되며, VARCHAR보다 인덱싱이나 정렬에서 제한이 있을 수 있습니다.
  5. SET은 어떤 경우에 사용하나요?
    • 하나의 필드에 여러 값을 저장해야 하는 경우 (예: 회원 취미, 서비스 요청사항 등)

카테고리:

업데이트:

댓글남기기