111
问题
生产上出现了数据添加失败的情况 (设置一条信息的有效时长, 到期自动失效 )
bug
查看日志发现了是 insert 的时候报错了. 在测试环境也能 正常复现, 设置到期时间(end_time)为 2040年以后的任意时间都不行
复现
正常情况是这样的: 异常情况是这样的: 遇见这样的问题 就可以 直接去百度 他提示的 错误码 1292 就能找到答案了
原因
这个表的时间类型是 : timestamp
解释
MYSQL timestamp取值范围是 1970-01-01 00:00:00 到 2038-01-19 3:14:07 TIMESTAMP和DATETIME的取值范围不同同时存储不同, TIMESTAMP占四个字节取值范围为 1970-01-01 00:00:00 到 2038-01-19 3:14:07
有待考证:
那么为什么是这个取值范围呢 4个字节明显不够存储日期格式。4字节为2^32次方 那么我们可以分析timestamp实际是C语言的一个INT 类型带符号位的。 用ORACLE的格式算出来为
SQL> select to_date('1970-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')+(power(2,31)-1)/(60*60*24) from dual;
解决方案:
将时间戳格式给为 datetime 就可以了
create table `test_time_bak_20220505` as select * from `test_time`;
alter table `test_time` modify column `end_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;
改完以后的数据: 参考文档 =https://blog.csdn.net/qq1137623160/article/details/79142254
每日上一当, 当当不一样.
每日踩一坑, 坑坑都很深.
|