MySQL에서 NOT NULL로 선언된 열에 빈 문자열('')을 삽입했을 때 결과가 0으로 표시되는 이유는, 빈 문자열도 NULL이 아닌 하나의 '값'이기 때문입니다.
많은 분들이 빈 문자열과 NULL을 혼동하지만, 두 개념은 완전히 다릅니다. NULL은 '값이 존재하지 않음'을 의미하는 반면, 빈 문자열은 길이가 0인 실제 문자열 값입니다. 따라서 빈 문자열을 삽입하면 MySQL은 이를 유효한 값으로 처리하고, 해당 열의 데이터 타입에 맞게 변환합니다.
정수(INT) 타입의 열에 빈 문자열을 삽입하면, MySQL은 이를 숫자로 해석하려고 시도하며 그 결과는 0이 됩니다. 즉, 빈 문자열은 정수 표현상 INT 0에 해당하는 값으로 매핑되는 것입니다.
예제로 확인하기
다음 예제에서는 id라는 INT 타입의 NOT NULL 열에 빈 문자열을 삽입하고, MySQL이 이를 어떻게 처리하는지 확인할 수 있습니다.
mysql> create table test(id int NOT NULL, Name Varchar(10));
Query OK, 0 rows affected (0.19 sec)
mysql> Insert into test(id, name) values('1', 'Gaurav'),('0','Rahul'),('&','Aarav');
Query OK, 3 rows affected, 1 warning (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 1
mysql> Select * from test;
+----+--------+
| id | Name |
+----+--------+
| 1 | Gaurav |
| 0 | Rahul |
| 0 | Aarav |
+----+--------+
3 rows in set (0.00 sec)위 실행 결과를 보면, 세 번째 레코드(Aarav)에는 id 값으로 빈 문자열을 삽입했지만 실제로는 0이 저장된 것을 확인할 수 있습니다. 또한 삽입 시 경고(warning)가 1건 발생한 점에 주목할 필요가 있습니다. 이는 MySQL이 유효하지 않은 입력값을 강제로 변환했음을 의미합니다.
핵심 정리
- NULL ≠ 빈 문자열: NULL은 값이 없는 상태, 빈 문자열은 길이가 0인 실제 값입니다.
- 타입 변환 동작: 정수 열에 빈 문자열을 넣으면 MySQL은 이를 0으로 변환합니다.
- 경고 발생: 이러한 암묵적 변환은 경고를 유발하며, 엄격 모드(STRICT mode)에서는 오류가 발생할 수 있습니다.
따라서 데이터 무결성을 유지하려면 정수 열에는 반드시 유효한 숫자 값이나 NULL(허용되는 경우)을 명시적으로 삽입하는 것이 좋습니다.