在使用mybatis发现这个错误,然后查看full stacktrace,终于发现了以下问题:
java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
原因是数据类型无法转换。这里整理一下timestamp对应的java和mysql值得范围。
数据 | 最小值 | 最大值 | 微秒 |
timestamp(mysql) | '1970-01-01 00:00:01' UTC | '2038-01-19 03:14:07' UTC. | 6位 |
java.sql.Timestamp | since January 1, 1970, 00:00:00 GMT | 2038-01-19 03:14:07 | 6位 |
TIMESTAMP的范围似乎是能对应的上的,但是我mysql里面的值竟然是'0000-00-00 00:00:00'?
在官网中有一句话:
Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').
无效的日期会被转换为'0000-00-00 00:00:00','0000-00-00 00:00:00'也可以被设置为默认值。
如何避免这种转换失败的异常:
通常,TIMESTAMP用于记录创建时间和修改时间,我们可以使用自动更新,确保存储的值合法
CREATE TABLE t1 (
create_time TIMESTAMP DEFAULT 0,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
mysql不允许一个表中2个字段使用DEFAULT CURRENT_TIMESTAMP,因此创建时间中,需要保证create_time的值正确
参考链接:
https://docs.oracle.com/cd/E13222_01/wls/docs45/classdocs/java.sql.Timestamp.html
https://dev.mysql.com/doc/refman/5.7/en/datetime.html
https://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html