Javaのjava.sql.Date型とMySQLのdate型の違いでハマった点があったので書いておきます。
JavaとMySQLを連携した以下のプログラムを動かしたところExceptionが出ました。
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SqlDateSample {
public static void main(String[] args) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
String url = "jdbc:mysql://localhost/sample";
String user = "root";
String password = "";
String sql = "SELECT * FROM sample";
try {
con = DriverManager.getConnection(url, user, password);
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
Date entryDate = rs.getDate("entry_date");
System.out.println(id + " : " + entryDate);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
そしてスローされたExceptionがこちら。
java.sql.SQLException: Value ‘0000-00-00’ can not be represented as java.sql.Date
どうやら0000-00-00という値がjava.sql.Dateにできないっぽい。
テーブルをみたら以下のデータが入っていました。
| id | entry_date |
|---|---|
| 1 | 2018-06-29 |
| 2 | 0000-00-00 |
原因は2行目の「0000-00-00」です。
検証してみたところ、MySQLのdate型のカラムには「0000-00-00」が登録できる。
一方でjava.sql.Date型の変数には「0000-00-00」は設定できないということがわかりました。
INSERT INTO sample (entry_date) VALUE ('0000-00-00');
→ INSERTできる
Date date = Date.valueOf("0000-00-00");
→ IllegalArgumentException
不正な値として「0000-00-00」を使おうと思ったのですが失敗しました。。。