NOT NULL로 선언된 MySQL 열에 빈 문자열을 삽입하면, 결과 집합(result set)에서 해당 값이 어떻게 표현되는지는 열의 데이터 타입에 따라 달라집니다. 여기서 핵심은, 빈 문자열을 삽입하면 MySQL이 이를 정수 표현인 INT 0에 해당하는 값으로 처리한다는 점입니다.
데이터 타입이 INTEGER인 경우
열의 데이터 타입이 INTEGER라면, 빈 문자열은 정수 0으로 매핑되므로 결과 집합에 0으로 표시됩니다.
예제
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)
데이터 타입이 VARCHAR인 경우
반면, 열의 데이터 타입이 VARCHAR와 같은 문자열 기반 타입이라면, 빈 문자열이 그대로 유지되어 결과 집합에 빈 문자열로 표시됩니다.
mysql> create table test123(id Varchar(10) NOT NULL, Name Varchar(10));
Query OK, 0 rows affected (0.19 sec)
mysql> Insert into test123(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 test123;
+----+--------+
| id | Name |
+----+--------+
| 1 | Gaurav |
| 0 | Rahul |
| | Aarav |
+----+--------+
3 rows in set (0.00 sec)
정리
위 예제들을 통해 확인할 수 있듯이, NOT NULL로 선언된 MySQL 열에 빈 문자열을 삽입할 때 데이터 타입은 저장되고 표시되는 값을 결정하는 중요한 역할을 합니다. 숫자 타입(INT)의 경우 빈 문자열이 자동으로 0으로 변환되지만, 문자열 타입(VARCHAR)의 경우 빈 문자열이 그대로 저장됩니다. 참고로 두 예제 모두 경고(warning)가 발생하는데, 이는 빈 문자열을 다른 타입의 값으로 변환하는 과정에서 MySQL이 데이터 변환 경고를 생성하기 때문입니다. 따라서 의도하지 않은 데이터 변환을 방지하려면 애플리케이션 단에서 명시적인 값을 삽입하는 것이 좋습니다.