MySQL에서는 NO_ZERO_IN_DATE 모드를 비활성화하면 월과 일이 0인, 즉 연도 값만 가진 날짜를 테이블에 저장할 수 있습니다. 반대로 이 모드가 활성화되어 있으면 MySQL은 해당 날짜를 유효하지 않은 날짜로 판단하여 모든 값을 0('0000-00-00')으로 저장합니다.
NO_ZERO_IN_DATE 모드에 따른 저장 결과 비교
아래 예제는 같은 날짜 값 '2017-00-00'을 삽입했을 때, NO_ZERO_IN_DATE 모드의 설정 여부에 따라 결과가 어떻게 달라지는지 보여줍니다.
mysql> Insert into year_testing (OrderDate) values('2017:00:00');
Query OK, 1 row affected (0.09 sec)
mysql> select * from year_testing;
+------------+
| OrderDate |
+------------+
| 2017-00-00 |
+------------+
1 row in set (0.00 sec)
mysql> SET sql_mode = 'NO_ZERO_IN_DATE';
Query OK, 0 rows affected (0.00 sec)
mysql> Insert into year_testing(OrderDate) values('2017:00:00');
Query OK, 1 row affected, 1 warning (0.04 sec)
mysql> Select * from year_testing;
+------------+
| OrderDate |
+------------+
| 2017-00-00 |
| 0000-00-00 |
+------------+
2 rows in set (0.00 sec)결과 해석
위 실행 결과를 보면 다음과 같은 차이를 확인할 수 있습니다.
- 모드 비활성화 시: '2017-00-00'이 입력한 그대로 정상적으로 저장됩니다.
- 모드 활성화 시: 데이터는 삽입되지만 경고(warning)가 발생하고, 실제로는 '0000-00-00'으로 변환되어 저장됩니다.
참고 사항
현재 세션에 적용된 SQL 모드는 SELECT @@sql_mode; 명령으로 확인할 수 있으며, 여러 모드를 함께 지정하려면 쉼표로 구분하여 설정하면 됩니다. 또한 엄격 모드(STRICT_TRANS_TABLES)와 함께 사용하면 경고 대신 오류가 발생하여 잘못된 날짜 삽입 자체가 거부될 수 있으므로, 운영 환경에서는 데이터 무결성 요구 사항에 맞게 모드를 신중히 선택하는 것이 좋습니다.