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

2020/12/31 21:21 · php ·  · 0评论

我对以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)
  • 直接在PHP中比较这些时间戳比通过strtotime()转换TIMESTAMP然后比较它们要更快。

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

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

TIMESTAMP的参数

  • 它隐式存储UTC时区中的数据。无论您的会话时区是什么。如果您需要使用不同的时区,则很有用。
  • 您可以使用DEFAULT CURRENT_TIMESTAMP或来为ON 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'
    

    所以范围实际上是相同的

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

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

确实应该在DATETIME和UNSIGNED INT之间进行比较,我建议使用DATETIME,因为:

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

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

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

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

与往常一样,它取决于您需要保存的内容。

例如,如果您正在使用某个API的数据,并且它以数字形式发送时间给您(秒,这在市场数据中很常见),那么将其存储为unsigned int而不是每次都转换为字符串就可以变得更加容易和快捷。插入之前。

本文地址:http://php.askforanswer.com/shiyongmysqldetimestampyuzhijiecunchushijianchuo.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!