mysql 1292错误码,timestamp存储范围问题

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;

-- TO_DATE('1970-01-0100:00:00','
-- ----------------------------
-- 2038/1/19 3:14:07

解决方案:

将时间戳格式给为 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

每日上一当, 当当不一样.

每日踩一坑, 坑坑都很深.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值