小编典典

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

mysql

我对以MySQL的TIMESTAMP格式和自定义的UNSIGNED
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和UNSIGNED INT之间陷入困境。

支持UNSIGNED INT的参数:

  • UNIX时间戳4294967295转换为Sun,2106年2月7日格林尼治标准时间(GMT),这比TIMESTAMP还要多,对我来说足够好
  • 直接在PHP中比较这些时间戳比通过strtotime()转换TIMESTAMP然后比较它们要更快。

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

是否有令人信服的理由使用TIMESTAMP而不是UNSIGNED INT?


阅读 1024

收藏
2020-05-17

共1个答案

小编典典

TIMESTAMP的参数

  • 它隐式存储UTC时区中的数据。无论您的会话时区是什么。如果您需要使用不同的时区,则很有用。
  • 您可以使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP(每个表只有一列,直到MySQL 5.6.5为止)才具有自动时间戳列。
  • 您可以使用datetime函数进行日期比较,加法,减法,范围查找等,而无需使用FROM_UNIXTIME()函数-这将使编写可使用索引的查询更加容易
  • 在PHP中
    >> date('Y-m-d h:i:s',4294967295);
    

    ‘1969-12-31 11:59:59’

所以范围实际上是相同的

* 您仍然可以使用UNIX_TIMESTAMP()函数来获取整数的unix时间戳,而不会产生额外的开销:[http](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp) : [//dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp)

在TIMESTAMP列上使用UNIX_TIMESTAMP()时,该函数将直接返回内部时间戳记值,而不进行隐式的“从字符串到Unix时间戳记”的转换

2020-05-17