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

时间:2010-11-27 02:25:11

标签: mysql datetime unix-timestamp

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

但是,我想知道这个专栏什么时候不再适用。在2038年1月19日凌晨3:14:07,值为9,999,999,999将是UNIX时间戳的问题 - 但MySQL中的unsigned int仅包含4,294,967,295,时间戳4294967295在我的PHP应用程序中显示无效数字。

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

答案:

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

1 个答案:

答案 0 :(得分:86)

标准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位。