MySQL의 ENUM 데이터 유형은 허용되는 값에 영향을 미치는 여러 가지 속성과 함께 정의할 수 있습니다. 대표적인 속성으로 NOT NULL, NULL, DEFAULT가 있으며, 각각의 역할을 제대로 이해하면 데이터 무결성을 더욱 효과적으로 관리할 수 있습니다.
ENUM 데이터 유형의 주요 속성
1. NOT NULL
ENUM 유형에서는 기본적으로 NULL 값이 허용됩니다. 따라서 NULL 값을 허용하고 싶지 않다면, ENUM 열을 정의할 때 반드시 NOT NULL 속성을 지정해야 합니다.
2. NULL
NULL 속성은 DEFAULT NULL의 동의어(synonym)입니다. 참고로 NULL의 인덱스 값 역시 NULL입니다.
3. DEFAULT
DEFAULT 속성은 INSERT 문에서 해당 필드에 값을 명시적으로 지정하지 않았을 때, 미리 정의해 둔 기본값이 자동으로 삽입되도록 합니다. 즉, INSERT 문이 이 필드의 값을 반드시 포함할 필요가 없습니다.
단, 주의할 점이 두 가지 있습니다.
- DEFAULT 표현식에는 함수를 사용할 수 없습니다.
- ENUM 데이터 유형의 DEFAULT 값으로는 NULL과 빈 문자열('')이 포함될 수 있습니다.
예제로 확인하는 ENUM 속성 활용법
다음 예제는 위에서 설명한 속성들이 실제로 어떻게 동작하는지 보여줍니다.
mysql> SET SESSION sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
mysql> Create Table enumtesting(e_value ENUM('a','1') NOT NULL DEFAULT '1', id TINYINT NOT NULL);
Query OK, 0 rows affected (0.23 sec)
mysql> Insert into enumtesting(e_value,id) values('1','1'),('',2),(NULL,3),('abc',4);
Query OK, 4 rows affected, 3 warnings (0.09 sec)
Records: 4 Duplicates: 0 Warnings: 3
mysql> show warnings;
+---------+------+----------------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------------+
| Warning | 1265 | Data truncated for column 'e_value' at row 2 |
| Warning | 1048 | Column 'e_value' cannot be null |
| Warning | 1265 | Data truncated for column 'e_value' at row 4 |
+---------+------+----------------------------------------------------+
3 rows in set (0.00 sec)
mysql> Select * from enumtesting;
+---------+----+
| e_value | id |
+---------+----+
| 1 | 1 |
| | 2 |
| | 3 |
| | 4 |
+---------+----+
4 rows in set (0.00 sec)위 결과에서 몇 가지 중요한 동작을 확인할 수 있습니다.
- 빈 문자열('') 입력 시: 유효한 ENUM 값이 아니므로 경고(Warning 1265)가 발생하고 빈 문자열로 저장됩니다.
- NULL 입력 시: 열이 NOT NULL로 정의되어 있기 때문에 경고(Warning 1048)가 발생하며 빈 문자열로 대체됩니다.
- 정의되지 않은 값('abc') 입력 시: 마찬가지로 데이터 잘림 경고와 함께 빈 문자열로 저장됩니다.
이번에는 e_value 열에 아무 값도 지정하지 않고 id만 삽입해 보겠습니다.
mysql> insert into enumtesting(id) values(5); Query OK, 1 row affected (0.11 sec) mysql> Select * from enumtesting; +---------+----+ | e_value | id | +---------+----+ | 1 | 1 | | | 2 | | | 3 | | | 4 | | 1 | 5 | +---------+----+ 5 rows in set (0.00 sec)
id가 5인 행에는 e_value 값을 지정하지 않았지만, DEFAULT '1' 속성 덕분에 자동으로 '1'이 삽입된 것을 확인할 수 있습니다.
마지막으로 e_value + 0을 사용해 각 값의 내부 인덱스를 조회해 보겠습니다.
mysql> select e_value, e_value+0 AS enum_index, id from enumtesting; +---------+------------+----+ | e_value | enum_index | id | +---------+------------+----+ | 1 | 2 | 1 | | | 0 | 2 | | | 0 | 3 | | | 0 | 4 | | 1 | 2 | 5 | +---------+------------+----+ 5 rows in set (0.00 sec)
ENUM 값은 내부적으로 인덱스 번호로 저장됩니다. 이 예제에서 'a'는 인덱스 1, '1'은 인덱스 2에 해당하며, 빈 문자열은 인덱스 0으로 처리됩니다. 이처럼 ENUM의 속성과 내부 인덱스 구조를 이해하면 예상치 못한 데이터 저장 결과를 방지하고 쿼리를 더 안전하게 작성할 수 있습니다.