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

sil*_*npi 37 php mysql datetime timestamp unsigned-integer

关于以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)
Run Code Online (Sandbox Code Playgroud)

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

有利于UNSIGNED INT的论据:

  • UNIX时间戳4294967295转换为Sun,格林威治标准时间2月7日2106 06:28:15这超过了TIMESTAMP,对我来说足够好了
  • 直接在PHP中比较这些时间戳会更快,而不是通过strtotime()转换TIMESTAMPs然后比较它们

TIMESTAMP给我的唯一好处是当我手动读取mysql表中的值并需要"看到"它们时.

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

Mch*_*chl 27

TIMESTAMP的参数

  • 它隐式地将数据存储在UTC时区中.无论你的会话时区是什么.如果您需要使用不同的时区,则非常有用.
  • 您可以使用DEFAULT CURRENT_TIMESTAMP或使用自动时间戳列ON UPDATE CURRENT_TIMESTAMP(每个表只有一列,直到MySQL 5.6.5)
  • 您可以使用日期时间函数进行日期比较,加法,减法,范围查找等,而无需使用FROM_UNIXTIME()函数 - 它可以更轻松地编写可以使用索引的查询
  • 在PHP中

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

    所以范围实际上是相同的

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

  • 至于你的第二个项目,只有一列可以成为DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP,正如这里所指出的那样(至少在MySQL v5.1上):http://dev.mysql.com/doc/refman/5.1/en /timestamp-initialization.html (2认同)

Tim*_*ain 9

TIMESTAMP的唯一真正用途是当您希望在更新行时自动更新该字段(这是该字段的默认行为),或者当数据存储要求严格到每行4个字节确实对您.

真的比较应该在DATETIME和UNSIGNED INT之间,我建议DATETIME,因为:

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

在我看来,单独的第二点确实消除了存储整数的任何理由.

  • DATETIME的缺点是它不会在现场存储GMT偏移量.您需要在存储之前将所有内容转换为GMT(或者您想要'zulu'时间的任何内容),然后在处理多个时区时将其转换回来.存储在INT中会删除其中一些要求. (2认同)
  • 如果您使用 DATETIME,您如何处理夏令时?当我们将时钟倒转一小时时,我们会回到与前一小时相同的时间。你没有 Unix 时间的潜在问题。 (2认同)

nob*_*ody 5

这可能不是一个“科学”的答案,但我总是发现 MySql 在 TIMESTAMP 列上处理转换、算术、比较等的方式令人困惑。UNSIGNED INT 列更直接,我总是知道会发生什么。

PS 也许支持 TIMESTAMP 列的另一件事是它能够在每次更新或插入后自动设置为当前时间,但这并不是你不能没有的。