MySQL에서 ENUM 열(column) 정의에 나열된 각 요소에는 1부터 시작하는 인덱스 번호가 자동으로 할당됩니다. 여기서 말하는 '인덱스'는 테이블 인덱스가 아니라 열거형 값 목록 안에서 해당 값이 차지하는 위치를 의미합니다. 아래 예제들을 통해 각 ENUM 열거형이 인덱스 값을 가지고 있음을 직접 확인해 보겠습니다.
열거형 값 대신 인덱스 번호로 데이터 삽입하기
ENUM 열에는 실제 문자열 값 대신 인덱스 번호를 사용해 데이터를 삽입할 수도 있습니다. 예를 들어 아래 테이블에는 'pass'와 'fail'이라는 두 개의 ENUM 값이 정의되어 있습니다. 'pass'가 열거형 목록에서 먼저 선언되었으므로 인덱스 번호 1을, 'fail'은 인덱스 번호 2를 가지게 됩니다. 따라서 다음과 같이 인덱스 번호만으로도 값을 삽입할 수 있습니다.
mysql> Insert into marks(id,name,result)values(103,'Daksh','1');
Query OK, 1 row affected (0.06 sec)
mysql> Insert into marks(id,name,result)values(104,'Shayra','2');
Query OK, 1 row affected (0.07 sec)
mysql> Select * from marks;
+-----+---------+--------+
| id | Name | Result |
+-----+---------+--------+
| 101 | Aarav | Pass |
| 102 | Yashraj | Fail |
| 103 | Daksh | Pass |
| 104 | Shayra | Fail |
+-----+---------+--------+
4 rows in set (0.00 sec)
위 쿼리에서는 열거형 값인 pass와 fail 대신 각각 인덱스 번호 1과 2를 사용해 데이터를 삽입했습니다.
열거형 값 대신 빈 문자열 삽입하기
빈 문자열('')의 인덱스 값은 0입니다. 단, 빈 문자열을 삽입하기 전에 SQL 모드가 TRADITIONAL, STRICT_TRANS_TABLES 또는 STRICT_ALL_TABLES로 설정되어 있어서는 안 됩니다. 다음 예제를 통해 이를 이해할 수 있습니다.
mysql> SET SESSION sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
mysql> Insert into marks(id, name, result) values(105,'Yashraj','');
Query OK, 1 row affected, 1 warning (0.06 sec)
위 쿼리는 열거형 값 자리에 빈 문자열을 삽입합니다. 이때 MySQL은 다음과 같은 경고 메시지와 함께 빈 문자열을 저장합니다.
mysql> Show warnings;
+---------+------+---------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------+
| Warning | 1265 | Data truncated for column 'Result' at row 1 |
+---------+------+---------------------------------------------+
1 row in set (0.00 sec)
테이블을 조회해 보면 ENUM 필드에 빈 문자열이 저장된 것을 확인할 수 있습니다. 또한 result+0 구문을 사용해 인덱스 값을 조회하면 결과를 명확하게 볼 수 있습니다.
mysql> Select * from marks;
+-----+---------+--------+
| id | Name | Result |
+-----+---------+--------+
| 101 | Aarav | Pass |
| 102 | Yashraj | Fail |
| 103 | Daksh | Pass |
| 104 | Shayra | Fail |
| 105 | Yash | |
+-----+---------+--------+
5 rows in set (0.00 sec)
mysql> Select result+0 As result_index from marks;
+--------------+
| result_index |
+--------------+
| 1 |
| 2 |
| 1 |
| 2 |
| 0 |
+--------------+
5 rows in set (0.01 sec)
위 쿼리의 출력 결과에서 알 수 있듯이, 빈 문자열의 인덱스 값은 0입니다.
열거형 값 대신 NULL 삽입하기
ENUM 열에 NOT NULL 제약 조건을 지정하지 않았다면, 열거형 값 대신 NULL을 삽입할 수 있습니다. 이때 NULL의 인덱스 값은 그대로 NULL입니다. 예를 들어 다음 쿼리를 사용해 'result' 테이블의 열거형 열에 NULL을 삽입하고 그 인덱스 값을 확인할 수 있습니다.
mysql> Create table result(Id INT PRIMARY KEY NOT NULL, Name Varchar(10), GradeENUM('POOR','GOOD'));
Query OK, 0 rows affected (0.25 sec)
mysql> Insert into result(id, name, grade) values(100, 'Rahul', NULL);
Query OK, 1 row affected (0.06 sec)위 쿼리는 열거형 값 자리에 NULL을 삽입하며, 아래 쿼리로 이를 확인할 수 있습니다.
mysql> Select * from result;
+-----+-------+-------+
| Id | Name | Grade |
+-----+-------+-------+
| 100 | Rahul | NULL |
+-----+-------+-------+
1 row in set (0.00 sec)
이어지는 쿼리를 통해 NULL의 인덱스 값 역시 NULL이라는 사실을 확인할 수 있습니다.
mysql> Select Grade+0 As Grade_index from result;
+-------------+
| Grade_index |
+-------------+
| NULL |
+-------------+
1 row in set (0.00 sec)