环境
MySQL:5.1.45
前言
今天遇到了这么一个和时间有关的bug,纠结了很久。
表中时间类型为:
TIMESTAMP
类型
错误如下:
主要错误信息:
Data truncation: Incorrect datetime value: '2038-12-31 00:00:00.0' for column
正文
查询资料后,才知道,原来:
当 timestamp 存储的时间大于 ‘2038-01-19 03:14:07’ UTC,mysql就会报错,
因为这是 mysql自身的问题,也就是说 timestamp是有上限的,超过了,自然会报错。
官方说明:
https://dev.mysql.com/doc/refman/8.0/en/datetime.html
The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in ‘YYYY-MM-DD’ format. The supported range is ‘1000-01-01’ to ‘9999-12-31’.
The DATETIME type is used for values that contain both date and time parts. MySQL retrieves and displays DATETIME values in ‘YYYY-MM-DD hh:mm:ss’ format. The supported range is ‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’.
The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of ‘1970-01-01 00:00:01’ UTC to ‘2038-01-19 03:14:07’ UTC.
可以看到
DATETIME
表示的范围很大。
所以可以考虑使用
DATETIME
来代替
TIMESTAMP
。
我自己的解决办法也是用
DATETIME
替换
TIMESTAMP
;
1970年份问题
错误信息如下:
Data truncation: Incorrect datetime value: ‘1970-01-01 08:00:00’ for column
其实从上面的官网中也可以看到:
TIMESTAMP类型的起始时间为:1970-01-01 00:00:01 ,若保存1970-01-01 08:00:00 肯定会报错的。
为了避免这种烦人问题,我也是直接替换为
DATETIME
。
保存null的问题
当我把相关字段的类型改为:
DATETIME
时,并允许为null;
即使如上图,我已经勾选了
Allow Null
,但是还是不行,会报如下错误:
Incorrect datetime value: 'null' for column
网友的解释:
mysql 在对 datetime 类型字段赋值时,有一个日期时间格式转换过程,如遇到非法的日期格式(比如 null)就会报错,你可以用’000-00-00 00:00:00’将他置空。
所以我就给它一个
000-00-00 00:00:00
默认值。
参考地址: