不,不能更改 MySQL 实例中单个数据库的时区。
我们可以通过time_zone
查询检索服务器和客户端设置,如下所示:
SELECT @@global.time_zone, @@session.time_zone;
我们还可以更改会话的客户端时区,或更改整个 MySQL 实例的时区。
但是我们需要敏锐地意识到这种变化将对现有客户端连接产生的影响,以及已经存储在实例中的方式DATETIME
和值将被解释。TIMESTAMP
要在 MySQL 实例启动时设置服务器 time_zone,我们可以/etc/my.cnf
在以下部分修改文件(或从任何地方读取 mysql 实例初始化参数)[mysqld]
:
[mysqld]
default-time-zone='+00:00'
- 或者 -
也可以(不太理想)将--default_time_zone='+00:00'
选项添加到 mysqld_safe
注意:更改 MySQL 服务器上的时区设置不会更改存储在现有 DATETIME 或 TIMESTAMP 列中的值,但由于它确实有效地更改了解释这些存储值的上下文,因此看起来所有值都已移动。(其中 08:00 表示美国中部标准时间上午 8 点,服务器的 time_zone 从 CST 更改为 GMT,同样的“08:00”现在将被视为格林尼治标准时间上午 8 点,这实际上是美国中部标准时间凌晨 2 点。
另请记住,TIMESTAMP 列始终以 UTC 存储,而 DATETIME 列没有时区。
http://dev.mysql.com/doc/refman/5.5/en/datetime.html
每个客户端会话都可以更改自己会话的时区设置:
SET time_zone='-06:00';
但这并没有真正“解决”时区转换问题,它只是移动了转换问题。
应用层处理时区转换本身并没有什么“坏处”;有时,这是最好的处理方式。它只需要正确且一致地完成。
(您描述的设置的奇怪之处在于该应用程序存储 DATETIME 值,就好像 MySQL 服务器 time_zone 设置为 GMT,但 MySQL 服务器 time_zone 设置为其他值一样。)