1. ENUM 타입 개요
ENUM 타입이란?
MySQL의 ENUM(열거형) 타입은 미리 정의된 목록 중 정확히 하나의 값만 저장할 수 있는 데이터 타입입니다. 컬럼에 저장될 수 있는 문자열이 사전에 정해져 있기 때문에 데이터 일관성을 보장하고 잘못된 값이 삽입되는 것을 방지합니다.
예를 들어, 사용자가 성별이나 제품 카테고리와 같이 제한된 선택지 중 하나를 선택하도록 할 때 ENUM 타입을 사용하면 불필요한 오류 검사 로직을 없앨 수 있습니다. 아래는 ENUM 컬럼을 포함한 테이블을 생성하는 예시입니다:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
category ENUM('食品', '衣料品', '家電', '家具') NOT NULL
);
이 예시에서 category 컬럼은 “食品”, “衣料品”, “家電”, “家具” 중 하나만 저장할 수 있습니다. 이를 통해 데이터 관리가 단순해지고 잘못된 입력 위험을 줄일 수 있습니다.
ENUM의 주요 사용 사례
ENUM 타입은 다음과 같은 상황에서 흔히 사용됩니다:
- 상태 관리 : “未開始”, “進行中”, “完了”와 같은 워크플로 단계 추적
- 카테고리 정의 : 제품 카테고리, 사용자 유형, 직책 등 미리 정의된 옵션 관리
- 등급 또는 레벨 그룹화 : 게임 난이도 (“初級”, “中級”, “上級”) 혹은 제품 평점 (“良い”, “普通”, “悪い”)
2. ENUM의 장점과 단점
장점
- 데이터 일관성 향상
ENUM은 미리 정의된 목록에 포함된 값만 허용하므로 일관된 데이터 처리가 가능합니다. 예를 들어 성별을 관리할 때 “男性” 또는 “女性”와 같이 정의된 값만 허용되어 잘못된 입력을 방지합니다. - 효율적인 저장 공간 사용
각 ENUM 값은 내부적으로 정수 인덱스로 저장됩니다. 따라서 VARCHAR보다 적은 저장 공간을 차지합니다. 예를 들어 ‘small’이나 ‘large’와 같은 문자열은 VARCHAR로 저장하면 더 많은 공간을 차지하지만, ENUM은 숫자 인덱스로 효율적으로 저장합니다.
단점
- 유연성 부족
ENUM 값은 고정되어 있습니다. 새로운 옵션을 추가하려면 테이블 구조를 변경해야 하므로, 자주 변하는 데이터셋에는 부적합합니다. - 복잡한 오류 처리
잘못된 값이 삽입되면 MySQL이 오류를 발생시키거나 빈 문자열을 저장할 수 있습니다. 이는 개발자 입장에서 디버깅을 복잡하게 만들 수 있습니다.
3. ENUM 설정 및 실전 활용
기본 설정 및 오류 처리
ENUM 타입을 설정하려면 유효한 문자열 목록을 정의하면 됩니다. 아래 예시는 테이블에 ENUM 컬럼을 정의하는 방법을 보여줍니다:
CREATE TABLE shirts (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
여기서 size 컬럼은 “XS”, “S”, “M”, “L”, “XL” 중 하나만 허용합니다. 목록에 없는 값(예: ‘XXL’)을 삽입하려고 하면 Data truncated 오류가 발생합니다. 이를 통해 잘못된 데이터 입력을 방지하고 일관성을 유지할 수 있습니다.
실전 활용 예시
다음 예시는 “管理者”, “一般ユーザー”, “ゲスト”와 같은 사용자 역할을 관리하기 위해 ENUM을 사용하는 방법을 보여줍니다:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
role ENUM('管理者', '一般ユーザー', 'ゲスト') NOT NULL
);
ENUM 컬럼을 사용하면 일관된 권한 관리와 역할 기반 제어를 손쉽게 유지할 수 있습니다.

4. ENUM 인덱싱 및 NULL/빈 문자열 처리
인덱스 활용
ENUM 값은 목록에서의 위치에 따라 정수 인덱스가 할당됩니다. 예를 들어:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('S', 'M', 'L', 'XL')
);
“S”는 인덱스 1, “M”은 인덱스 2 등으로 매핑됩니다. 이러한 인덱스는 WHERE 절에서 활용할 수 있습니다:
SELECT * FROM products WHERE size = 2;
위 쿼리는 size가 “M”에 해당하는 레코드를 조회합니다.
NULL 및 빈 문자열 처리
NULL을 허용하도록 설정하면, ENUM 목록에 없더라도 컬럼에 NULL을 유효한 상태로 저장할 수 있습니다. 또한, 잘못된 데이터가 빈 문자열로 삽입될 경우 인덱스 0으로 저장되어 잘못된 입력을 쉽게 감지할 수 있습니다.
5. ENUM의 문자 집합 및 콜레이션 설정
문자 집합과 콜레이션 설정 방법
ENUM은 CHAR나 VARCHAR와 마찬가지로 문자 집합 및 정렬 규칙 정의를 지원합니다. 다국어 데이터 처리나 정렬 작업 시 중요합니다. 예시:
CREATE TABLE documents (
id INT AUTO_INCREMENT PRIMARY KEY,
language ENUM('日本語', '英語', '中国語')
CHARACTER SET utf8
COLLATE utf8_general_ci
);
이 예시는 UTF-8과 일반 목적의 정렬 규칙을 지정합니다.
6. ENUM 확장 및 대안
ENUM 확장을 위한 기법
ENUM은 동적 값을 위한 유연성이 부족하므로, “기타” 옵션을 포함하고 자유 형식 입력을 별도의 열에 저장할 수 있습니다:
ALTER TABLE products
MODIFY COLUMN category ENUM('食品', '衣料品', '家電', '家具', 'その他') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
이는 ENUM 목록에 포함되지 않은 값을 구조를 유지하면서 저장할 수 있게 합니다.
대안 데이터 타입: SET 또는 VARCHAR
요구 사항에 따라 다음과 같은 대안이 있습니다:
- SET 타입 : 목록에서 여러 선택을 저장합니다.
- VARCHAR : 사전 정의된 제약 없이 최대 유연성을 제공합니다.

