从数据文件看timestamp范围限制

  • 创建表:
mysql> desc test_timestamp1;
+-------+-----------+------+-----+---------+-------+
| Field | Type      | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| time  | timestamp | YES  |     | NULL    |       |
+-------+-----------+------+-----+---------+-------+
  • 插入数据,并查询,mysql官方文档解释:timestamp的范围:1970-01-01 00:00:01UTC~2038/01/19 3:14:07UTC,
  • 我们是东八区,所以我们的timestamp的范围:1970-01-01 8:00:01UTC~2038/01/19 11:14:07UTC,测试很简单:
mysql> insert into test_timestamp1 values('2038/01/19 11:14:07');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_timestamp1 values('2038/01/19 11:14:08');
ERROR 1292 (22007): Incorrect datetime value: '2038/01/19 11:14:08' for column 'time' at row 1

mysql> insert into test_timestamp1 values('1970-01-01 8:00:01');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_timestamp1 values('1970-01-01 8:00:00');
ERROR 1292 (22007): Incorrect datetime value: '1970-01-01 8:00:00' for column 'time' at row 1

  • 为什么有这样的限制?可以从数据文件中找到答案:
mysql> select * from test_timestamp1 limit 2;
+---------------------+
| time                |
+---------------------+
| 2038-01-19 11:14:07 |
| 2038-01-19 11:14:06 |
+---------------------+
2038-01-19 11:14:07
查看表空间文件:
hexdump -C -v test_timestamp1.ibd|more
0000c1a0  00 00 00 07 75 0b 00 00  01 43 f1 16 e1 00 00 01
0000c1b0  7d 01 10 7f ff ff ff 00  00 00 68 00 1d 00 00 00
0000c1c0  07 75 0c 00 00 01 43 f1  17 e2 00 00 02 4e 01 10
0000c1d0  7f ff ff fe 00 00 00 70  00 1d 00 00 00 07 75 0d
0000c1e0  00 00 01 43 f1 7c b4 00  00 02 2a 01 10 7f ff ff

  • 猜测7f ff ff fe(01111 1111 .... 1110)就是2038-01-19 11:14:06,7f ff ff ff(01111 1111 .... 1111)(最高位是符号位?)就是2038-01-19 11:14:07,为什么这么说?
做个简单的查询:
mysql> select unix_timestamp('2038-01-19 11:14:07');
+---------------------------------------+
| unix_timestamp('2038-01-19 11:14:07') |
+---------------------------------------+
|                            2147483647 |
+---------------------------------------+
2147483647就是"2038/01/19 3:14:07UTC"减去"1970-01-01 8:00:01 UTC"的秒数,也就是说实际上mysql在存储时间戳的时候,会求取32位的整数,存储在磁盘上。
mysql> select pow(2,31)-1;
+-------------+
| pow(2,31)-1 |
+-------------+
|  2147483647 |
+-------------+


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值