MySQL学习笔记:2038和1970年份问题

环境

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默认值。

在这里插入图片描述


参考地址:

为什么datetime类型的值不能修改为null?解决思路

mysql 解决 timestamp 的2038问题

11.2.2 The DATE, DATETIME, and TIMESTAMP Types

MySQL的日期存储’1970-01-01 08:00:00’ 问题

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值