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

出于统计原因,我有一个包含数百万次写入的日志记录表。所有列都是 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。

最佳答案

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

https://stackoverflow.com/questions/4289793/

相关文章:

mysql - 将聊天消息存储在数据库中的最佳方法?

mysql - phpmyadmin.pma_table_uirefs 不存在

mysql - 如何使用时区信息在 MySQL 中存储日期时间

mysql - 在 Windows 7 上重新启动 mysql 服务器

mysql - 查找和替换整个 MySQL 数据库

mysql - 在 MySQL 查询中结合 UNION 和 LIMIT 操作

mysql - 将主机访问权限重新分配给 MySQL 用户

sql - MySQL:ORDER BY RAND() 的替代方案

mysql - 从另一列计算的列?

MySQL - 使用 LIMIT 更新查询