當 MySQL 表中 DATE 或 DATETIME 欄位預設值為 '0000-00-00 00:00:00' 時,使用 JDBC PreparedStatement 配合 ResultSet.getDate() 讀取會拋出異常:
java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date
MySQL 允許「零日期」作為合法預設值,但 java.sql.Date 類別不承認此格式,導致型別轉換失敗。這在舊系統遷移或未嚴格規範 DDL 時常見。
zeroDateTimeBehavior在 JDBC URL 中加入此參數,指定遇到零日期時的轉換策略:
'0001-01-01 00:00:00'String url = "jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=round";
適用於業務邏輯需保留日期欄位非空特性的場景。
NULLString url = "jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull";
適用於業務允許日期為空,且後續程式碼已處理 NULL 判斷的場景。
convertToNull,若仍需舊行為請顯式指定 round。NULL,並調整應用層邏輯。DEFAULT CURRENT_TIMESTAMP 或 DEFAULT NULL,避免零日期產生。修改 URL 後重啟應用,執行查詢測試:
SELECT date_col FROM test_table WHERE date_col = '0000-00-00';
若無拋出異常且回傳預期值(0001-01-01 或 NULL),即表示配置生效。