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()
,但没有成功。#1 楼
要与@ypercube的评论(CURRENT_TIMESTAMP
存储为UTC但作为当前时区检索)一起使用,可以使用--default_time_zone选项进行检索来影响服务器的时区设置。这使您的检索始终使用UTC。 默认情况下,选项为'SYSTEM',这是设置系统时区的方式(可能不是UTC!):
您可以动态设置:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
1 row in set (0.00 sec)
mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 16:28:45 |
+---------------------+
1 row in set (0.00 sec)
或永久设置在您的my.cnf中:
mysql> SET @@session.time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | +00:00 |
+--------------------+---------------------+
1 row in set (0.00 sec)
/>重新启动服务器,您将看到更改:
[mysqld]
**other variables**
default_time_zone='+00:00'
评论
非常有帮助的帖子!
–om39a
2014年6月2日19:44
是否可以为特定的表或数据库指定default_time_zone?谢谢。
– W.M.
16年8月11日在15:20
是否可以为特定查询指定default_time_zone?
–mcmillab
16年8月22日在5:06
@mcmillab,您可以在运行查询之前设置会话时区,然后在运行其他查询(或重新连接)之前重置为全局时区。
–德里克·唐尼(Derek Downey)
16年8月22日在13:39
紧接着mcmillab还是用显示基础UTC值的运算符查询列(因为转换不是1-to1)?
– Marc L.
17年6月30日在15:03
#2 楼
您不能将UTC_TIMESTAMP
指定为默认值来指定自动属性,而应仅使用DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
子句。 /> CREATE TABLE `test` (
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
INSERT查询将像这样插入UTC_TImeSTAMP:
insert into `test` (`ts`)
values
(utc_timestamp()) ;
评论
感谢您“您不能将UTC_TIMESTAMP指定为默认值以指定自动属性”
–Barbaros Alp
16年2月1日在13:44
#3 楼
我的解决方案是使用触发器:DELIMITER //
CREATE TRIGGER `update_to_utc` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN
set new.my_field=utc_timestamp();
END//
DELIMITER ;
然后,每个新插入的行都将具有UTC时间戳。
#4 楼
对于mariadb,只有全局my.cnf解决方案有效对于mariadb 10.2,这是@Derek Downey的永久解决方案。
[mysqld]
**other variables**
default_time_zone='+00:00'
对于mariadb 10.0(我有10.0.32),
请参见https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions -use-utc
[mysqld_safe]
**other variables**
timezone = UTC
这两个定义可能共存于mariadb 10.2的my.cnf中,但我没有mariadb 10.0了。 >
希望对您有帮助。
#5 楼
John C的解决方案对我有用,但我也不得不更改sql模式,因为当我尝试向该表添加索引时,我将收到错误消息“错误1067(42000):无效的默认值值”删除模式NO_ZERO_IN_DATE,NO_ZERO_DATE
解决了设置索引的问题。
`Created` datetime NOT NULL DEFAULT (UTC_TIMESTAMP)
#6 楼
在MySql 8.0.13中,如果用括号括起来,则可以将UTC_TIMESTAMP
用作dafault值... CREATE TABLE `blah` (
id int NOT NULL AUTO_INCREMENT,
creation_time TIMESTAMP NOT NULL DEFAULT (UTC_TIMESTAMP)
)
评论
您尝试过CURRENT_TIMESTAMP吗?它可以工作,但不存储本地时区值而不是UTC。
您到底想做什么?将UTC时间戳存储在表列中吗?还是别的?
从DATE,DATETIME和TIMESTAMP类型中:MySQL将TIMESTAMP值从当前时区转换为UTC以进行存储,然后从UTC转换为当前时区以进行检索。
请注意,作为UTC的存储仅适用于TIMESTAMP数据类型,不适用于DATE和DATETIME(尽管您可以将其默认设置为CURRENT_TIMESTAMP)。在同一文档页面上:(对于其他类型,例如DATETIME,不会发生这种情况。)。