Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL ENUM 열거형의 인덱스 값을 확인하는 방법

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)