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

MySQL ENUM 데이터 유형의 주요 속성 완벽 정리: NOT NULL, NULL, DEFAULT

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의 속성과 내부 인덱스 구조를 이해하면 예상치 못한 데이터 저장 결과를 방지하고 쿼리를 더 안전하게 작성할 수 있습니다.