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

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

但是,我想知道什么时候这个列将不再工作。 在2038年1月19日3:14:07 AM,值9,999,999,999将成为UNIX时间戳的问题 – 但是MySQL中的无符号整数只能保留最多4,294,967,295,并且时间戳4294967295在我的PHP应用程序中显示无效的数字。

那么这是什么意思? 在2021年,MySQL的存储int时间戳的结尾是否会到达9999999999?

回答:

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

标准UNIX时间戳是一个有符号的32位整数,在MySQL中是一个常规的“int”列。 没有办法存储9,999,999,999,因为这超出了代表范围 – 任何types的最高32位整数可以是4,294,967,295。 最高有签名的32bit进去是2,147,483,647。

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

至于int(10)(10)部分仅用于显示目的。 MySQL仍然会在内部使用一个完整的32位来存储这个数字,但是只要你在表格上进行select,就只能显示10个数字。