java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
dt_col DATETIME NOT NULL (無默認值)'0000-00-00 00:00:00' (零日期)zeroDateTimeBehavior=exception,遇到零日期拋出異常java.sql.Timestamp 最小值為 0001-01-01 00:00:00,無法映射零日期jdbc:mysql://host:3306/db?zeroDateTimeBehavior=convertToNull&characterEncoding=utf8
nullnull,需做非空判斷jdbc:mysql://host:3306/db?zeroDateTimeBehavior=round&characterEncoding=utf8
0001-01-01 00:00:00jdbc:mysql://host:3306/db?noDatetimeStringSync=true&characterEncoding=utf8
'0000-00-00 00:00:00'ALTER TABLE tbl_name MODIFY dt_col DATETIME NULL DEFAULT NULL; -- 或 ALTER TABLE tbl_name MODIFY dt_col DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
INSERT INTO tbl_name (dt_col, ...) VALUES (NOW(), ...);
-- 或
INSERT INTO tbl_name (dt_col, ...) VALUES ('2024-01-15 14:30:00', ...);
UPDATE tbl_name SET dt_col = NULL WHERE dt_col = '0000-00-00 00:00:00'; -- 或更新為業務合理默認值 UPDATE tbl_name SET dt_col = CURRENT_TIMESTAMP WHERE dt_col = '0000-00-00 00:00:00';
-- 檢查當前 sql_mode SELECT @@sql_mode; -- 若包含 NO_ZERO_DATE / NO_ZERO_IN_DATE -- 插入零日期會直接報錯而非警告 -- 建議生產環境開啟嚴格模式 SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
| 驅動版本 | 默認 zeroDateTimeBehavior | 建議設置 |
|---|---|---|
| 5.1.x (舊) | exception | convertToNull |
| 8.0.x (新) | CONVERT_TO_NULL (大寫) | 保持默認或顯式指定 |
零日期異常本質是數據不合法與驅動嚴格映射的衝突。治理優先級:
zeroDateTimeBehavior=convertToNull 作為安全網NO_ZERO_DATE 從源頭阻擋零日期寫入