【Java】Javaのjava.sql.Date型とMySQLのdate型の違い


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

  • このエントリーをはてなブックマークに追加

PAGE TOP