文档可能不清楚。
time_zone=SYSTEM 表示 MySQL Server 时区源自运行 MySQL Server 的主机,而不是客户端系统。
因此,如果 MySQL 服务器主机上的时区与客户端主机的时区不同,则说明您观察到的行为。
每个客户端(数据库会话)都有自己的time_zone 设置。建立连接后,该设置源自 MySQL 服务器的“默认”时区。
此变量的设置决定了如何解释 DATETIME 和 TIMESTAMP 值,何时将值从客户端发送到数据库,以及何时从数据库中提取现有值。
客户端可以发出SET time_zone 语句来更改数据库会话的时区,例如
SET time_zone=CST6CDT
(请注意,要为时区使用命名值,必须填充 mysql 数据库中的 time_zone% 表。)
要设置将用于新数据库连接的“默认”时区,您可以设置“全局”时区变量:
SET GLOBAL time_zone=
(此更改需要 SUPER 权限,它会影响到整个实例的所有新数据库连接。通常,此值在 MySQL 服务器配置文件中设置。)
对于TIMESTAMP 列,MySQL 将它们存储为 UTC。返回给客户端的值取决于客户端time_zone 的设置。作为一个简单的演示:
mysql> CREATE TABLE mytest
-> ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
-> , ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-> );
Query OK, 0 rows affected (0.11 sec)
mysql> SHOW VARIABLES LIKE 'time_zone';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | +00:00 |
+---------------+--------+
1 row in set (0.00 sec)
mysql> INSERT INTO mytest (id) VALUES (NULL);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM mytest;
+----+---------------------+
| id | ts |
+----+---------------------+
| 1 | 2015-01-09 15:41:25 |
+----+---------------------+
1 row in set (0.00 sec)
mysql> SET time_zone = 'CST6CDT';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM mytest;
+----+---------------------+
| id | ts |
+----+---------------------+
| 1 | 2015-01-09 09:41:25 |
+----+---------------------+
1 row in set (0.00 sec)
mysql> INSERT INTO mytest (id) VALUES (NULL);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM mytest;
+----+---------------------+
| id | ts |
+----+---------------------+
| 1 | 2015-01-09 09:41:25 |
| 2 | 2015-01-09 09:41:25 |
+----+---------------------+
2 rows in set (0.00 sec)
mysql> SET time_zone = 'EST5EDT';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM mytest;
+----+---------------------+
| id | ts |
+----+---------------------+
| 1 | 2015-01-09 10:41:25 |
| 2 | 2015-01-09 10:41:25 |
+----+---------------------+
2 rows in set (0.00 sec)