【问题标题】:How to store UNIX timestamps with MySQL如何使用 MySQL 存储 UNIX 时间戳
【发布时间】:2017-02-15 16:34:30
【问题描述】:

一些背景:

我的网站在很大程度上依赖于协调各种不同时区的用户。

我在服务器端使用 Carbon 处理我的时区转换和计算,在客户端使用 moment.js。

因此,设计选择将所有日期时间(例如事件的开始时间)存储为 unix 时间戳。

问题

我对“时间戳”的定义有点困惑。在 PHPMyAdmin 中,时间戳不是 unix 时间戳,而是日期格式:

2016-10-06 20:50:46

因此,如果您想拥有当前时间戳的默认字段,那么您将获得 GMT 中的当前日期。

与 unix 时间戳整数相比,这使得转换回用户时区变得更加复杂......

问题:

我应该将我的 unix 时间戳存储为什么字段类型,目前我使用的是int(11),默认为none。通过扩展...有没有办法在 MySQL 中默认存储当前的 unix 时间戳(例如 1475971200)?

【问题讨论】:

  • 您可以通过将 datetime 从和转换为 unix 时间戳来规避问题。因此,要插入 unix 时间戳,您将在表中创建一个 DATETIME 字段,并将 unix 时间戳转换为 FROM_UNIXTIME(1514789942)。然后,当您想在 unix timstamp 中检索值时,您可以执行 SELECT UNIX_TIMESTAMP(my_datetime_field)

标签: php mysql date datetime unix


【解决方案1】:

Unix 时间戳是一个大整数(自 1970-01-01 00:00:00 UTC 以来的秒数),因此 INT(11) 是正确的数据类型。

不幸的是,我认为没有任何方法可以指定插入当前时间戳的默认值。您需要在插入时显式调用 UNIX_TIMESTAMP() 并使用它。 DEFAULT 规范中不允许函数调用。

【讨论】:

  • 为什么是11个字节?
  • 不是11个字节,是十进制的11位,也就是32位数字能显示多少位。
  • INT(11) 不会成功,只是试了一下,将 2147483647 存储为 1623925731158。BIGINT 成功了。
  • @DBencz UNIX_TIMESTAMP() 以秒为单位,MySQL 时间戳函数仅支持高达 2**31-1 的值,它适合 INT(11)。您似乎添加了 3 位数字(毫秒)。
【解决方案2】:

您可以继续使用无符号 INT,但您必须手动设置插入时的时间戳 (UNIX_TIMESTAMP())。

或者您可以使用带有默认 CURRENT_TIMESTAMP 的 TIMESTAMP 类型(在后台存储为 int)并在选择时将其转换为 int:
SELECT UNIX_TIMESTAMP(foo_field) FROM foo_table

参考 - Is it possible to create a column with a UNIX_TIMESTAMP default in MySQL?

【讨论】:

    【解决方案3】:

    实际上,您必须使用bigint 或varchar,因为int(11) 的最大值为2'147'483'647(更多信息here)。

    然后,正如前面的答案所说,您必须手动插入UNIX_TIMESTAMP()

    【讨论】:

    猜你喜欢
    • 2017-06-14
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多