如何使用 MySQL 存储 UNIX 时间戳
Posted
技术标签:
【中文标题】如何使用 MySQL 存储 UNIX 时间戳【英文标题】:How to store UNIX timestamps with MySQL 【发布时间】: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)
【参考方案1】:
Unix 时间戳是一个大整数(自 1970-01-01 00:00:00 UTC 以来的秒数),因此 INT(11)
是正确的数据类型。
不幸的是,我认为没有任何方法可以指定插入当前时间戳的默认值。您需要在插入时显式调用 UNIX_TIMESTAMP()
并使用它。 DEFAULT
规范中不允许函数调用。
【讨论】:
为什么是11个字节? 不是11个字节,是十进制的11位,也就是32位数字能显示多少位。 INT(11) 不会成功,只是试了一下,将 2147483647 存储为 1623925731158。BIGINT 成功了。 @DBenczUNIX_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()
【讨论】:
Int(11) 就足够了,不需要 bigint。 unix 时间戳不能超过 19. 2038 年 1 月,因为它通常是有符号的 32 位整数。见en.wikipedia.org/wiki/Year_2038_problem以上是关于如何使用 MySQL 存储 UNIX 时间戳的主要内容,如果未能解决你的问题,请参考以下文章
从 Python 将 unix 时间戳插入 MySQL [重复]
如何使用 PHP 将 MySQL 时间转换为 UNIX 时间戳?
如何将 SQL Server SMALLDATETIME 转换为 Unix 时间戳?