MySQL SQLException: Zero date value prohibited 해결하기
MySQL에서 datetime 타입의 컬럼의 값을 조회할 때 다음과 같은 exception이 발생하는 경우가 있습니다.
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Zero date value prohibited
ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not execute query; nested exception is org.hibernate.exception.GenericJDBCException: could not execute query] with root cause
com.mysql.cj.exceptions.DataReadException: Zero date value prohibited
...
(이하 생략)
이러한 exception은 MySQL에서 timestamp 컬럼을 조회할 때 발생하는데 값이 zero date(0000-00-00 00:00:00)로 저장되어 있는 경우에 java의 date 객체로 변환화는 과정에서 발생합니다.
MySQL은 날짜 형식 컬럼에 값을 저장할 때 변환 과정에서 오류가 발생하면 zero date로 저장하고 valid date로 처리합니다. 하지만 zero date는 java.sql.Date 객체에서 표현할 수 없는 값이기 때문에 조회 후 변환하는 과정에서 exception이 발생하게 됩니다.
문제를 해결하기 위해서는 datasource 설정에서 jdbc url 뒤에 다음과 같이 zeroDateTimeBehavior=convertToNull 옵션을 추가해주면 됩니다.
jdbc:mysql://{IP}:{PORT}/{DB_NAME}?zeroDateTimeBehavior=convertToNull
이상으로 MySQL Zero date value prohibited Exception 해결 방법에 대해 알아봤습니다.
※ Reference
www.oodlestechnologies.com, How to handle DATETIME values with zero Timestamp in JDBC, https://www.oodlestechnologies.com/blogs/How-to-handle-DATETIME-values-with--zero-Timestamp-in-JDBC
118k.tistory.com, [MySQL] Cannot convert value '0000-00-00 00:00:00' from column 12 to TIMESTAMP 오류 처리, Javascript 와 Number 숫자, https://118k.tistory.com/455