NOT NULL 열에 0이나 빈 문자열을 넣을 수 있는 이유
열을 'NOT NULL'로 선언한다는 것은 해당 열이 NULL 값을 허용하지 않는다는 의미입니다. 하지만 0과 빈 문자열('')은 그 자체로 유효한 값이기 때문에, NOT NULL로 정의된 MySQL 열에 0이나 빈 문자열을 삽입하는 데에는 전혀 문제가 없습니다.
여기서 중요한 점은 NULL이 '값이 없음(NO VALUE)'을 의미한다는 것입니다. 즉, NULL은 0이나 빈 문자열과는 완전히 다른 개념입니다. 다음 비교 쿼리를 통해 이를 명확하게 확인할 수 있습니다.
0과 NULL 비교
mysql> Select 0 IS NULL, 0 IS NOT NULL; +-----------+---------------+ | 0 IS NULL | 0 IS NOT NULL | +-----------+---------------+ | 0 | 1 | +-----------+---------------+ 1 row in set (0.00 sec)
위 결과 집합은 0이 NULL이 아님을 보여줍니다. 즉, 0은 그 자체로 하나의 값이며, NULL처럼 '값이 없는 상태'가 아니라는 뜻입니다.
빈 문자열과 NULL 비교
mysql> Select '' IS NULL, '' IS NOT NULL; +------------+----------------+ | '' IS NULL | '' IS NOT NULL | +------------+----------------+ | 0 | 1 | +------------+----------------+ 1 row in set (0.00 sec)
마찬가지로 위 결과 집합은 빈 문자열('')이 NULL이 아님을 보여줍니다. 빈 문자열도 그 자체로 하나의 값으로 취급되므로 NOT NULL 제약 조건과 충돌하지 않습니다.
실제 예제
mysql> create table test(id int NOT NULL, Name Varchar(10));
Query OK, 0 rows affected (0.19 sec)
mysql> Insert into test6(id, name) values('1', 'Gaurav'),('0','Rahul'),(('','Aarav');
Query OK, 3 rows affected, 1 warning (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 1
Warning (Code 1366): Incorrect integer value: '' for column 'id' at row 3
mysql> Select * from test;
+----+--------+
| id | Name |
+----+--------+
| 1 | Gaurav |
| 0 | Rahul |
| 0 | Aarav |
+----+--------+
3 rows in set (0.00 sec)위 결과에서 확인할 수 있듯이, NOT NULL로 선언된 열에도 0과 빈 문자열('')을 성공적으로 삽입할 수 있습니다.
주의 사항
예제에서 눈여겨볼 점은 INT 타입의 id 열에 빈 문자열('')을 삽입했을 때 경고(Warning Code 1366)가 발생하고, 해당 값이 자동으로 0으로 변환되어 저장된다는 것입니다. 이는 MySQL이 엄격 모드(strict mode)가 아닐 때 나타나는 동작으로, 데이터 타입이 일치하지 않는 값을 삽입할 경우 예상치 못한 결과가 저장될 수 있으므로 주의해야 합니다.