MySQL 将 UTC 时间设置为默认时间戳

Ada*_*tan 41 mysql syntax timestamp utc-time

如何设置默认值为当前 UTC 时间的时间戳列?

MySQL 使用UTC_TIMESTAMP()UTC 时间戳函数:

mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP()     |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

所以我试过:

CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...
Run Code Online (Sandbox Code Playgroud)

和其他变体,如UTC_TIMESTAMP(),但没有成功。

Der*_*ney 56

要与CURRENT_TIMESTAMP存储为 UTC 但作为当前时区检索的@ypercube 的评论一起使用,您可以使用--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)
Run Code Online (Sandbox Code Playgroud)

您可以动态设置:

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)
Run Code Online (Sandbox Code Playgroud)

或永久在您的 my.cnf 中:

[mysqld]
**other variables**
default_time_zone='+00:00'
Run Code Online (Sandbox Code Playgroud)

重新启动您的服务器,您将看到更改:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 20:27:50 |
+---------------------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

  • 很有帮助的帖子!! (2认同)
  • 是否可以为特定查询指定 default_time_zone? (2认同)

小智 12

对于MySQL 8.0.13,如果用括号将其括起来,则可以用作UTC_TIMESTAMP默认值,如下所示:

CREATE TABLE `blah` (
    id int NOT NULL AUTO_INCREMENT,
    creation_time TIMESTAMP NOT NULL DEFAULT (UTC_TIMESTAMP)
)
Run Code Online (Sandbox Code Playgroud)


Mah*_*til 6

您不能指定UTC_TIMESTAMP为默认来指定自动属性,您应该只使用 DEFAULTCURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP子句。

您也可以UTC_TIMESTAMP为表插入这样的值:

CREATE TABLE `test` (
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)

INSERT 查询会像这样插入 UTC_TIMESTAMP:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;
Run Code Online (Sandbox Code Playgroud)


小智 5

我的解决方案是使用触发器:

DELIMITER //
CREATE TRIGGER `update_to_utc` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN
set new.my_field=utc_timestamp();
END//
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

然后每个新插入的行都将具有 UTC 时间戳。