使用MySQL的时间戳与直接存储时间戳

我陷入了两难境地,无法以MySQL的TIMESTAMP格式保存日期和时间值,而不是以自定义UNSIGN INT格式保存日期和时间值。这里的主要考虑因素是检索速度,PHP中适当的范围计算以及偶尔格式化为人类可读的值。

每种类型及其范围所需的存储空间:

DATETIME        8 bytes  '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
TIMESTAMP       4 bytes  '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC
UNSIGNED INT    4 bytes  (Maximum Value 4294967295)

我根本不需要DATETIME的范围。我在TIMESTAMP和UNSIGN INT之间徘徊。

支持无符号 INT 的论据:

  • 4294967295的UNIX时间戳转换为星期日,07 Feb 2106 06:28:15 GMT,这比TIMESTAMP更多,对我来说足够好
  • 直接在PHP中比较这些时间戳会更快,而不是通过strtotime()转换时间戳然后比较它们

TIMESTAMP给我的唯一优势是当我手动读取mysql表中的值并需要“查看”它们时。

是否有任何令人信服的理由使用时间戳而不是无符号的INT?


答案 1

时间戳的参数

  • 它以 UTC 时区隐式存储数据。无论您的会话时区是什么。如果您需要使用不同的时区,则很有用。
  • 您可以使用 或 (在 MySQL 5.6.5 之前,每个表只有一列)自动为列添加时间戳DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP
  • 您可以使用datetime函数进行日期比较,加法,减法,范围查找等,而无需使用函数 - 这将使编写可以使用索引的查询变得更加容易FROM_UNIXTIME()
  • 在 PHP 中

    >> date('Y-m-d h:i:s',4294967295);
    '1969-12-31 11:59:59'
    

    所以范围实际上是一样的

当在 TIMESTAMP 列上使用 UNIX_TIMESTAMP() 时,该函数直接返回内部时间戳值,没有隐式的“字符串到 Unix 时间戳”转换


答案 2

TIMESTAMP 的唯一真正用途是,当您希望在更新行时自动更新该字段(这是该字段的默认行为),或者当数据存储要求非常严格以至于每行 4 个字节对您真正产生影响时。

实际上,比较应该在DATETIME和UNSIGN INT之间,我推荐DATETIME,因为:

  • 您可以使用MySQL的本机日期/时间函数按日期范围等进行选择。
  • 在 PHP 中,将这些日期选为 UNIX 时间戳非常容易:,无需选择原始值并使用 strtotimeSELECT UNIX_TIMESTAMP(field) FROM table
  • 如果需要,可以更轻松地直接读取和编辑数据库中的字段(如您所指出的)。
  • 日期范围没有限制

在我看来,仅第二点就确实消除了以整数存储的任何理由。


推荐