百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

MySQL的时间戳2038年问题,在Linux系统上使用mysql8模拟下

haoteby 2025-02-08 11:07 16 浏览

目录

  • 前言
  • 1,关于MySQL时间戳的2038年BUG
  • 2,使用Docker创建MySQL 模拟下
  • 3,总结下

1,关于MySQL时间戳的2038年BUG


当 timestamp 存储的时间大于 ‘2038-01-19 03:14:07’ UTC,mysql就会报错,
因为这是 mysql自身的问题,也就是说 timestamp是有上限的,超过了,自然会报错。

  1. timestamp的时间范围是:‘1970-01-01 00:00:01’ UTC to ‘2038-01-19 03:14:07’ UTC ,自动时区转化,实际存储毫秒数,4字节存储
  2. datetime的时间范围:‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’ ,不支持时区,8字节存储

但是真的到了2038年会怎样呢?

2,在Linux上,使用Docker创建MySQL 模拟下


Mac 系统不让修改到2038年1月1日以后,估计会有BUG,直接变砖。找了个Linux上进行修改。

在默认的Linux 系统上开启了时间同步需要停止下,然后直接设置成2038年2月1日。
创建表之后再修改时间,在linux 系统上进行修改。
不是进入docker 环境中修改。

sudo systemctl stop systemd-timesyncd

sudo date -s 20380202
[sudo] test 的密码: 
2038年 02月 02日 星期二 00:00:00 CST

这里需要使用最新的myslq 版本。

使用5.7 更改日期,直接异常了:
起码DBA是要在这之前升级到新版本,需要忙活一阵子了。

2038-02-01T16:00:14.626767Z 6 [Warning] Iteration 1: Current time obtained from system is greater than 2038
2038-02-01T16:00:14.626778Z 6 [Warning] Iteration 2: Current time obtained from system is greater than 2038
2038-02-01T16:00:14.626786Z 6 [Warning] Iteration 3: Current time obtained from system is greater than 2038
2038-02-01T16:00:14.626794Z 6 [Warning] Iteration 4: Current time obtained from system is greater than 2038
2038-02-01T16:00:14.626801Z 6 [Warning] Iteration 5: Current time obtained from system is greater than 2038
2038-02-01T16:00:14.626809Z 6 [ERROR] This MySQL server doesn't support dates later than 2038
2038-02-01T16:00:14.627757Z 0 [Note] Giving 2 client threads a chance to die gracefully
2038-02-01T16:00:14.627821Z 0 [Note] Shutting down slave threads
2038-02-01T16:00:16.627925Z 0 [Note] Forcefully disconnecting 2 remaining clients

启动最新的mysql 8 :

docker run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root \
  -v /data/mysql:/var/lib/mysql --name mysql mysql:debian

# 设置密码root 
# 设置存储文件在/data/mysql 目录才可以启动成功。

创建数据库和表:


CREATE DATABASE demo DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 


CREATE TABLE `test_time` (
  `id` bigint(16) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
  `time1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试时间表';

然后插入下,确实插入有问题了。

mysql>   insert into sys_test(id,time1) values (1, now());
ERROR 1292 (22007): Incorrect datetime value: '2038-02-01 16:00:45' for column 'time1' at row 1
mysql> 

但是进行查询的时候:

mysql> SELECT FROM_UNIXTIME ( UNIX_TIMESTAMP() )
    -> ;
+------------------------------------+
| FROM_UNIXTIME ( UNIX_TIMESTAMP() ) |
+------------------------------------+
| 2038-02-01 16:05:20                |
+------------------------------------+
1 row in set (0.00 sec)

mysql> select UNIX_TIMESTAMP();
+------------------+
| UNIX_TIMESTAMP() |
+------------------+
|       2148653589 |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT FROM_UNIXTIME ( 2147483647 )
    -> ;
+------------------------------+
| FROM_UNIXTIME ( 2147483647 ) |
+------------------------------+
| 2038-01-19 03:14:07          |
+------------------------------+
1 row in set (0.00 sec)

模拟的方式,首先使用最新的mysql 8 ,然后创建库和表,再插入数据。
重启 mysql 8 ,首先只有mysql 8 最新的是可以启动成功。其他的版本没有实验。

然而并没有出现查询出 1970 年的情况,没有溢出,说明数据库已经对时间戳进行升级,支持 2147483647 以上的数据了。

但是要是对数据库进行映射 还是需要使用 long 型比较稳妥。
或者数据库直接换成 datetime 类型即可。

3,总结


所以在设计 mysql 数据表的时候还是要使用 datetime 比较好。
不要使用时间戳字段,虽然还有16年,以后用啥数据库都不知道了。
但是保险起见还是一次到位好,再有datetime 更直观,时间戳看的费劲。
还需要转换,使用不方便。

还是那句老话,还是踏踏实实的使用 datetime 时间戳进行存储吧。

相关推荐

手机如何检测是否被安装木马程序?如何防止路由器被黑客重置?

黑客攻击无线路由器有3种途径:...

盈盈可握的娇媚——全能美物ORICO WRE-30

由于工作的关系经常出差,在酒店除了一个RJ45接头,通常都没有无线网络可以提供,不可能自己携带太大的无线路由器,便携式的也买过几个,但是功能上大打折扣实在无法忍受,一直期盼能有既便携也功能丰富强大的产...

安卓重大锁屏密码漏洞,国产手机有几个中招了?

上周,一条新闻吸引了托尼注意。只用一张SIM卡,1分钟不到就能解锁你的安卓手机?...

零代码+免费+联网搜索:用DeepSeek+AnythingLLM搭建专属AI知识库

引言在信息爆炸的时代,如何高效管理私有数据并借助AI能力实现精准问答?本地私有知识库成为解决数据安全与智能化的最佳方案。本文将手把手教你使用开源工具AnythingLLM(项目地址:...

iOS越狱更轻松?黑客破解Lightning连接器

IT之家(www.ithome.com):iOS越狱更轻松?黑客破解Lightning连接器近日,德国黑客StefanEsser,也就是人们熟知的i0n1c在他Twitter上表示,黑客已成功破解了...

如何在 Windows 11 中更改 PIN

#寻找数码点评派#打开Windows设置,转到帐户登录选项,然后选择PIN(WindowsHello)...

2019年终黑客工具盘点-最佳篇

2019已经匆匆溜走,在2020伊始,小兮为大家带来了2019年终工具盘点的最佳篇,将分成三个部分为大家推荐工具,分别是Windows最佳工具、Linux最佳工具和手机最佳工具。话不多说,开整!Win...

磁盘被 BitLocker 锁住了怎么办?教你轻松解决

如果你的磁盘被BitLocker锁住,通常是因为系统检测到潜在的安全风险(如硬件改动、多次密码错误等)或丢失了密钥。以下是分步解决方案:一、确认被锁原因①硬件改动:更换主板、TPM芯片或启动顺序变化可...

风靡全球的安全应用AppLock,同样可能泄露隐私

安全研究人员发现,DoMobileLtd.公司开发的知名的安卓安全应用AppLock存在多个漏洞,容易受到黑客攻击。AppLock应用锁简介AppLock在超过50个国家拥有1亿多用户,它自身支持2...

安卓5.1.1前所有版本曝密码漏洞,轻松乱码即可破解锁屏

据德州大学研究人员发现代号棒棒糖的Android5.x存在一个严重的软件漏洞,只要攻击者能拿到机子的情况下,手机若设置的是数字密码解锁方式,只要输入足够长的乱码就能绕过屏幕锁定,进入到HOME主页取...

手机里有钱的,这5项设置要打开,就算丢了别人也偷不走

随着手机支付时代的到来,可恨的坏人也紧跟支付方式的变化,改为盯上了我们的手机。如果你手机里有钱的,那么一定不要掉以轻心,做好以下5项设置,让手机里的钱的更安全。设置SIM卡锁定设置SIM卡锁定,其实就...

原来破解邻居家的WiFi这么难?还是用万能钥匙吧

我们中的许多人认为,入侵wifi就像用铁锤打破塑料锁一样,并且使用以下提到的工具也是如此。入侵无线网络只是从防御性安全转移到攻击性安全的开始部分。入侵wifi包括捕获连接的握手并使用字典攻击等各种攻击...

电脑开机PIN码忘记了怎么办?教你不用重装系统也可以重置

在使用电脑的时候,我们往往会为了保护电脑的安全,从而设置开机密码。但是总会出现PIN码忘记导致无法开机使用,特别是许多用户反复的输入错误密码导致登录次数过多或者重复的开关机,登录选项被禁用,请使用其他...

送你个使用锦囊 防止蓝牙耳机被“策反”

你每天戴的蓝牙耳机可能被定位跟踪?近日有报道称,部分蓝牙耳机存在安全漏洞,可被不法分子快速植入具有定位功能的代码,从而实现远程跟踪,甚至监听。这一话题迅速登上微博热搜榜,不少网友惊呼:自己身边居然潜伏...

系统小技巧:无懈可击 Windows组策略管理系统密码

为了保护自己的系统安全,我们一般都会为系统设置密码。不过很多人为了记忆方便,设置的都是类似“123456”这样的简单密码,或者即使设置了较为复杂的密码,但是使用的时间很长也不变化。这些密码策略其实都有...