Tips

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

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

Javaのjava.sql.Date型とMySQLのdate型の違いでハマった点があったので書いておきます。

JavaとMySQLを連携した以下のプログラムを動かしたところExceptionが出ました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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」は設定できないということがわかりました。

1
INSERT INTO sample (entry_date) VALUE ('0000-00-00');

→ INSERTできる

1
Date date = Date.valueOf("0000-00-00");

IllegalArgumentException

不正な値として「0000-00-00」を使おうと思ったのですが失敗しました。。。

新連載はじまりました!新Java基礎 連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search