흔하지 않은 경우이지만, 데이터를 조회할 때 JAVA – Value ‘0000-00-00’ can not be represented as java.sql.Date 를 만나게 되었고, 원인과 오류 해결 방법에 대해서 알아보자.


상황


MySQL에서 Date 컬럼에 접근 할 때 에러가 발생하였다.

JAVA – Value ‘0000-00-00’ can not be represented as java.sql.Date


원인


MySQL에서 날짜 타입(date, datetime)에 값이 ‘0000-00-00’, ‘0000-00-00 00:00:00’ 경우, Connector/J driver에서 에러로 판단해서 발생하게 된다. MySQL의 Connector/J 3.1 또는 Connector/J 5.x JDBC driver를 사용할 때도 발생한다.


해결방법


  • 좋은 방법은 날짜 타입(date, datetime)에 값이 0이 아닌 값을 넣어 주는 것이지만, 임의로 데이터를 바꾸어 주는 것은 좋지 못하다고 생각한다.
  • 따라서, MySQL에 접속 할 때 자동으로 null로 변환해주는 옵션을 추가한다.
  • MySQL Connector/J 3.1 및 최신 버전은 zeroDateTimeBehaviorconnectstring 속성을 지원한다.
    • convertToNull(날짜 대신 Null을 리턴)
    • round(2001-01-01의 반올림 날짜를 리턴)
  • connectstring 값을 zeroDateTimeBehavior=convertToNull로 설정하면 데이터베이스에서 null 값이 반환되고, 출력에서 빈 문자열로 나타난다.
    jdbc:mysql://{ip}:{port}/{dbname}?zeroDateTimeBehavior=convertToNull
    



개인적으로 datebase에 날짜를 insert를 하는 경우에는 특별한 경우가 없는 한, Null 대신에 시스템 날짜를 넣어 주는 것이 더 맞다고 생각한다.