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

MySQL에서 ENUM 열에 잘못된 값을 삽입하면 어떻게 될까?

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; 쿼리로 언제든지 확인할 수 있습니다.