반응형
java.sql.SQLException: Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp

 

 

◆ 에러원인


확인해 보니 UPDATE_TIMESTAMP라는 필드의 기본값(Default)이 0000-00-00 00:00:00으로 설정돼 있었다.

 

MySQL의 DATETIME 또는 TIMESTAMP 컬럼에 기본값을 0000-00-00 00:00:00으로 설정하면,

Java 애플리케이션에서 이를 가져올 때 JDBC 드라이버(MySQL Connector/J 드라이버)가 0으로만 구성된 날짜값을 유효하지 않은 날짜로 판단하기 때문에 기본적으로 java.sql.Timestamp로 변환할 수 없다는 예외를 발생시킨다.

 

이는 MySQL 5.6 이하 버전에서 발생하는 에러인데 MySQL 5.7 이상부터는 기본적으로 STRICT_TRANS_TABLES 및 NO_ZERO_DATE SQL 모드가 활성화되어 있기 때문에, 이 모드에서는 0000-00-00 00:00:00과 같은 유효하지 않은 날짜를 DATETIME이나 TIMESTAMP 컬럼에 삽입할 때 아래 에러가 발생한다.

ERROR 1067 (42000): Invalid default value for '컬럼명'

 

 

 

◆ 해결방안


1. zeroDateTimeBehavior 옵션을 사용하는 방안

zeroDateTimeBehavior 옵션을 통해 MySQL Connector/J 드라이버에서 0000-00-00 00:00:00과 같이 0으로만 구성된 날짜값의 대한 처리 방법을 지정한다.

 

zeroDateTimeBehavior의 옵션은 3가지인데 CONVERT_TO_NULL 또는 ROUND를 사용하면 위와같은 에러를 회피할 수 있다.

EXCEPTION 기본옵션값으로 잘못된 날짜를 만났을때 예외를 발생시킨다. (현재 에러가 발생가 발생한 이유)
CONVERT_TO_NULL 잘못된 날짜인 경우 NULL로 변환하여 반환한다.
ROUND 날짜를 가장 가까운 값인 0001-01-01로 반올림 한다. (근사치가 반환되기 때문에 정확하지 않다.)

 

jdbc:mysql://{host}/{db}?zeroDateTimeBehavior=convertToNull
jdbc:mysql://{host}/{db}?zeroDateTimeBehavior=round

 

이번경우에는 db.properties의 url에 zeroDateTimeBehavior=convertToNull 옵션을 적용하여 해결하였다.

 

2. 테이블의 기본값을 NULL로 설정하는 방안

유효하지 않은 날짜를 NULL로 변환할 필요 없이 날짜 필드의 기본값을 0000-00-00 00:00:00 대신 NULL로 설정한다.

 

 

참조
Date and Time Data Types
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html
JDBC Connector with MySQL: SQLException aboutTimestamp
https://www.ibm.com/support/pages/jdbc-connector-mysql-sqlexception-abouttimestamp

 


글 내용 중 잘못된 부분이 있거나, 첨부하실 내용이 있으시면 댓글로 남겨주세요. 공부하는데 많은 도움이 됩니다.
-- 기억의 유효기간은 생각보다 짧다. --

 

반응형