一尘不染

Unix时间戳应如何存储在int列中?

mysql

我有一个日志记录表,出于统计原因,该表将包含数百万的写入。所有列都是int外键。我还将为每一行添加一个时间戳列。鉴于DATETIME占用8位-我将int(10) unsigned用来将存储空间(和该列的索引)减少一半。

但是,我想知道此列何时不再起作用。在2038年1月19日凌晨3:14:07,对于UNIX时间戳,值9,999,999,999将是一个问题-
但是MySQL中的unsigned int仅可容纳4,294,967,295,时间戳4294967295在我的PHP应用程序中显示了无效的数字。

那么这是什么意思? 由于无法一直到9999999999,MySQL中存储int时间戳的结尾是否会在2021年某个时候结束?

回答:

  1. 2147483647是2038(不是9999999999),所以没有问题。
  2. unsigned 不需要,因为2147483647非常适合已签名的MySQL int。

阅读 785

收藏
2020-05-17

共1个答案

一尘不染

标准UNIX时间戳是带符号的32位整数,在MySQL中是常规的“ int”列。您无法存储9,999,999,999,因为这超出了表示范围-
任何类型的32位int最高可以达到4,294,967,295。签名的最高32位为2,147,483,647。

如果/当UNIX时间戳记变为64位数据类型时,则必须使用MySQL“ bigint”来存储它们。

至于int(10),该(10)部分仅用于显示目的。MySQL仍将在内部使用完整的32位存储数字,但是只要您在表上进行选择,则仅显示10。

2020-05-17