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」を使おうと思ったのですが失敗しました。。。