ENUM에 잘못된 값 삽입 시 MySQL의 동작 방식
MySQL에서 ENUM 열에 허용된 목록에 없는 잘못된 값을 삽입할 때의 결과는 SQL 엄격 모드(Strict Mode) 설정 여부에 따라 크게 달라집니다.
- 엄격 모드가 비활성화된 경우: 오류를 발생시키지 않고 대신 빈 문자열('')을 삽입하며, 경고(warning)만 표시됩니다.
- 엄격 모드가 활성화된 경우: 잘못된 값이 삽입되면 오류를 발생시키고 INSERT 작업 자체가 실패합니다.
예제 1: 엄격 모드가 비활성화된 경우
엄격 모드를 비활성화한 상태에서 ENUM에 유효하지 않은 문자열을 삽입해 보겠습니다.
mysql> INSERT INTO result(id, name, grade) VALUES(100, 'Gaurav', 'abcd'); Query OK, 1 row affected, 1 warning (0.03 sec) mysql> SELECT * FROM result; +-----+--------+-------+ | Id | Name | Grade | +-----+--------+-------+ | 100 | Gaurav | | +-----+--------+-------+ 1 row in set (0.00 sec)
위 쿼리 결과에서 확인할 수 있듯이, MySQL은 잘못된 문자열 대신 빈 문자열을 삽입했으며 오류는 발생하지 않았습니다.
삽입된 값이 빈 문자열임을 확인하는 방법
다음과 같이 산술 연산을 활용하면 ENUM 값의 내부 인덱스 번호를 확인할 수 있습니다. 결과가 0으로 나타나는데, 이는 ENUM에서 빈 문자열의 인덱스 값이 항상 0이기 때문입니다. 즉, MySQL이 실제로 빈 문자열을 저장했음을 의미합니다.
mysql> SELECT Grade + 0 FROM result; +-----------+ | Grade + 0 | +-----------+ | 0 | +-----------+ 1 row in set (0.00 sec)
예제 2: 엄격 모드가 활성화된 경우
반면, 아래와 같이 SQL 모드를 'Traditional'로 설정하여 엄격 모드를 활성화한 후에는 ENUM에 잘못된 문자열을 삽입할 때 MySQL이 명확하게 오류를 반환합니다.
mysql> SET SQL_MODE = 'Traditional'; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO result(id, name, grade) VALUES(101, 'Saurabh', 'abcd'); ERROR 1265 (01000): Data truncated for column 'Grade' at row 1
오류 메시지 ERROR 1265 (Data truncated)는 해당 열에 허용되지 않는 데이터가 입력되었음을 알려주며, 데이터 무결성을 지키는 데 매우 유용합니다.
정리
운영 환경에서는 예기치 않은 빈 문자열 저장으로 인한 데이터 품질 문제를 방지하기 위해 엄격 모드(STRICT_TRANS_TABLES 등)를 활성화하는 것이 권장됩니다. 현재 적용된 SQL 모드는 SELECT @@sql_mode; 쿼리로 언제든지 확인할 수 있습니다.