MySQL 8.0 Incorrect date value error
[Aurora MySQL 8.0] DATE 컬럼 조회 시 Incorrect DATE value: '' 에러 분석
MySQL 5.7 ➡️ 8.0 업그레이드 후 WHERE date_col = '' 쿼리가 에러(ERROR 1525)를 내는 이유와 sql_mode 동작 원리
AWS Aurora MySQL 5.7에서 8.0으로 업그레이드를 진행한 후, 기존 서비스에서 잘 작동하던 DATE 타입 컬럼 조건문에서 뜬금없이 에러가 발생하는 현상을 마주쳤습니다.
결론부터 말하면 WHERE date_col = ''처럼 빈 문자열을 조건으로 넣었을 때 에러가 발생하는데, 정작 WHERE date_col = '0000-00-00' 조회를 시도하면 정상 작동하는 이상한 상황이 펼쳐집니다. 원인을 단계별로 정리해 둡니다.
1. 문제의 배경: sql_mode 옵션 (NO_ZERO_DATE / NO_ZERO_IN_DATE)
MySQL에는 날짜 처리 방식을 결정하는 두 가지 핵심 sql_mode 옵션이 존재합니다.
-
NO_ZERO_DATE
• Enable:0000-00-00값을 유효하지 않은 날짜(Invalid date)로 인식하여 저장/조회를 제한합니다.
• Disable:0000-00-00값 저장을 허용합니다. -
NO_ZERO_IN_DATE
• Enable: Month나 Day 부분에 0이 포함된 날짜(예:2022-12-00,2022-00-01)를 Invalid date로 처리합니다.
• Disable: 해당 형태의 날짜 입력을 허용합니다.
MySQL 5.7 및 8.0부터는 기본적으로 이 두 옵션이 활성화되어 있어, 데이터가 없는 테이블에 아래 조회를 수행하면 에러가 발생합니다.
-- MySQL 5.7 / 8.0 기본 설정에서는 두 쿼리 모두 Incorrect date value 에러 발생
SELECT id_table, text_table FROM new_table WHERE date_table = '';
SELECT id_table, text_table FROM new_table WHERE date_table = '0000-00-00';
(참고: MySQL 5.6 이하 버전에서는 에러 대신 경고(Warning)만 발생하고 쿼리가 실행되었습니다.)
2. sql_mode 옵션을 해제하면 어떻게 될까?
하위 호환성을 위해 SQL_MODE에서 NO_ZERO_DATE 및 NO_ZERO_IN_DATE 옵션을 제거한 뒤 테스트를 진행해 보았습니다.
-- 옵션 제거 후 데이터 INSERT 테스트
INSERT INTO new_table (text_table, date_table)
VALUES ('good','2022-06-16'), ('one zero','2022-06-00'), ('zero all','0000-00-00');
-- Query OK, 정상 저장됨!
이후 WHERE date_table = '0000-00-00'으로 조회하면 의도한 대로 결과가 출력됩니다.
하지만, WHERE date_table = '' (빈 문자열) 조건은 여전히 에러가 발생합니다.
ERROR 1525 (HY000): Incorrect DATE value: ''
Warning (Code 1292): Incorrect date value: '' for column 'date_table' at row 1
왜 NO_ZERO_DATE 옵션을 해제했음에도 빈 문자열('') 조건은 해결되지 않는 걸까요?
빈 문자열('')은 Zero Date와 아무런 관련이 없는 단순한 불법/잘못된 String 조건일 뿐이기 때문입니다.
3. 핵심 원인: MySQL 8.0의 String ➡️ DATE 형변환 메커니즘 변경
MySQL이 DATE 타입 컬럼과 상수 문자열(Constant String)을 비교할 때 내부적으로 처리하는 메커니즘이 MySQL 5.x에서 8.0(8.0.16 이상)으로 넘어가며 근본적으로 변경되었습니다.
-
MySQL 5.x 버전대:
비교 시 String을 DATE로 먼저 변환을 시도합니다. 이때''처럼 변환에 실패(Fail)하면 바로 멈추는 것이 아니라, 비교 대상을 DATE에서 String으로 우회 변경하여 비교를 강제로 계속 진행합니다. (결과: 경고/Warning만 발생 후 통과) -
MySQL 8.0 이상 버전:
String ➡️ DATE 변환 과정에서 실패가 발생하는 순간 우회하지 않고 즉시ER_WRONG_VALUE와 함께 Comparison 전체를 실패 처리합니다. (결과: 에러/Error 발생)
📌 요약 및 결론
WHERE date_col = ''조건은sql_mode의 Zero Date 옵션 문제가 아닌, 잘못된 형변환(Invalid String Conversion) 문제입니다.- MySQL 5.x는 잘못된 형변환 시 우회하여 Warning으로 넘겨주었으나, MySQL 8.0부터는 엄격하게 Error를 리턴합니다.
- 해결책: 애플리케이션 레벨에서 DATE 타입 컬럼을 조회할 때 빈 문자열(
'')을 조건절에 바인딩하지 않도록 쿼리를 수정하거나,IS NULL조건으로 정제해야 합니다.
본 포스팅은 이범확 님의 MySQL 8.0 string dates 분석 글을 참고하여 정리되었습니다.
댓글
댓글 쓰기