如何设置默认值为当前 UTC 时间的时间戳列?
MySQL 使用UTC_TIMESTAMP()
函数获取 UTC 时间戳:
mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP() |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)
所以我试过:
CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...
和其他变体,如UTC_TIMESTAMP()
,但没有成功。
要与
CURRENT_TIMESTAMP
存储为 UTC 但检索为当前时区的 @ypercube 注释一起使用,您可以使用--default_time_zone检索选项影响服务器的时区设置。这使您的检索始终采用 UTC。默认情况下,选项是“SYSTEM”,这是您的系统时区的设置方式(可能是也可能不是 UTC!):
您可以动态设置:
或永久保存在您的 my.cnf 中:
重新启动服务器,您将看到更改:
使用MySql 8.0.13,
UTC_TIMESTAMP
如果用括号括起来,则可以将其用作默认值...您不能
UTC_TIMESTAMP
将自动属性指定为默认值,您应该只使用 DEFAULTCURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
子句。您也可以为表插入
UTC_TIMESTAMP
这样的值:INSERT 查询将像这样插入 UTC_TImeSTAMP:
我的解决方案是使用触发器:
然后每个新插入的行都将具有 UTC 时间戳。
对于 mariadb,只有全局 my.cnf 解决方案有效
对于 mariadb 10.2,@Derek Downey 在这篇文章中的永久解决方案。
对于 mariadb 10.0(我有 10.0.32),请参阅https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc
这两种定义可能在 mariadb 10.2 的 my.cnf 中共存,但我不再有 mariadb 10.0。
希望这会帮助你。
John C 的解决方案对我有用
但我还必须更改 sql 模式,因为当我尝试向该表添加索引时,我会收到错误“ERROR 1067 (42000): Invalid default value”
删除模式 NO_ZERO_IN_DATE,NO_ZERO_DATE
解决了设置索引的问题。