一尘不染

将MySQL数据库时区设置为GMT

mysql

我需要更改单个数据库的时区吗?

我知道我们可以在WHM中更改时区(我们正在使用hostgator的专用服务器),但是服务器上运行的大量旧版软件中有很多+6小时的编码(即服务器时区为CST,需要GMT时间,因此以前的开发人员会在代码中手动更改日期/时间-
很糟糕!)。

我现在正在开发一个新软件,并希望将其全部保存在GMT中,我知道我可以使用date_default_timezone_set(’GMT’),但是由于datetime列设置为CURRENT_TIMESTAMP,这无法解决MySQL插入问题,因为它将插入@
CST时区。


阅读 1317

收藏
2020-05-17

共1个答案

一尘不染

不,不可能更改MySQL实例中单个数据库的时区。

我们可以time_zone通过查询来检索服务器和客户端设置,如下所示:

SELECT @@global.time_zone, @@session.time_zone;

我们还可以更改会话的客户端时区,或更改整个MySQL实例的时区。

但是,我们需要敏锐地意识到此更改将对现有客户端连接产生的影响,并且将解释实例中已存储的方式DATETIMETIMESTAMP值。

要在MySQL实例启动时设置服务器time_zone,我们可以/etc/my.cnf在以下[mysqld]部分下修改文件(或在读取mysql实例初始化参数的任何位置):

[mysqld]
default-time-zone='+00:00'

- 要么 -

也可以(不太理想)将--default_time_zone='+00:00'选项添加到mysqld_safe

注意:
更改MySQL服务器上的时区设置不会更改存储在现有DATETIME或TIMESTAMP列中的值,但由于它确实有效地更改了解释这些存储值的上下文,因此看起来所有值都已移位。(如果将08:00表示为CST,则服务器的time_zone从CST更改为GMT,则现在将相同的“
08:00”设为GMT 8AM,实际上就是2AM CST。

还请记住,TIMESTAMP列始终存储在UTC中,而DATETIME列没有时区。
http://dev.mysql.com/doc/refman/5.5/zh-
CN/datetime.html

每个客户端会话都可以为其自己的会话更改时区设置:

SET time_zone='-06:00';

但这并不能真正“解决”时区转换问题,它只是解决了转换问题。

应用程序层处理时区转换没有天生的“坏”之处。有时,这是处理的最佳地点。它只需要正确且一致地完成即可。

(您描述的设置奇怪的是,应用程序正在存储DATETIME值,就像将MySQL服务器time_zone设置为GMT,而将MySQL服务器time_zone设置为其他东西一样。)

2020-05-17