【问题标题】:What size of an INT do I need to store Unix timestamp in MySQL database?在 MySQL 数据库中存储 Unix 时间戳需要多大的 INT?
【发布时间】:2016-09-10 02:55:52
【问题描述】:

我是否需要 MySQL 数据类型 INTBIGINT 来存储由 PHP 的 mktime 返回并由 date 函数使用的 Unix 时间戳?

【问题讨论】:

  • 你为什么不用TIMESTAMPDATETIME内置的MySQL?
  • 除非有非常特殊的原因需要将“日期”存储为整数,否则我建议使用 MySQL 的内部日期/时间戳函数。
  • 虽然你真的应该使用 DATETIME。
  • @CharlotteDunois:谢谢,看来BIGINT 是确保它面向未来的方法。至于DATETIME,是我的原创设计。不幸的是,PHP 在为 MySQL 转换日期和YYYY-MM-DD HH:MM:SS 格式方面非常糟糕,所以为了清楚起见,我决定坚持使用 Unix 时间戳。例如,我将所有日期存储在 UTC 时区。但是当我进行这些转换时,PHP 会尝试将其转换为服务器的本地时间,这太痛苦了!!!

标签: php mysql int


【解决方案1】:

您可以检查 PHP 的常量 PHP_INT_MAX 以找到最大整数。这会因环境而异。在我的本地系统上:

echo date('Y-m-d H:i:s', PHP_INT_MAX) . '<br />';
// outputs: 292277026596-12-04 09:30:07

所以我可以创建的最大时间戳是:

echo mktime(9, 30, 7, 12, 4, 292277026596);
// outputs: 9223372036854775807

任何更大的结果都类似于2038 problem(数字变为负数)。

所以在我的特定系统上,我需要使用 mysql 的 BIGINT 来存储这些值,因为 INT 最多只能达到 2147483647。Reference

【讨论】:

  • 谢谢。是的,听起来BIGINT 是要走的路。而且,正如上面 cmets 中有人建议的那样,TIMESTAMP 不起作用,因为它隐含 32 位。再加上TIMESTAMP 与 UTC 之间的隐式转换(这让我抓狂!)
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 2017-06-14
  • 2017-02-15
  • 2011-02-15
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
相关资源
最近更新 更多