我需要更改单个数据库的时区吗?
我知道我们可以在WHM中更改时区(我们正在使用hostgator的专用服务器),但是服务器上运行的大量旧版软件中有很多+6小时的编码(即服务器时区为CST,需要GMT时间,因此以前的开发人员会在代码中手动更改日期/时间- 很糟糕!)。
我现在正在开发一个新软件,并希望将其全部保存在GMT中,我知道我可以使用date_default_timezone_set(’GMT’),但是由于datetime列设置为CURRENT_TIMESTAMP,这无法解决MySQL插入问题,因为它将插入@ CST时区。
不,不可能更改MySQL实例中单个数据库的时区。
我们可以time_zone通过查询来检索服务器和客户端设置,如下所示:
time_zone
SELECT @@global.time_zone, @@session.time_zone;
我们还可以更改会话的客户端时区,或更改整个MySQL实例的时区。
但是,我们需要敏锐地意识到此更改将对现有客户端连接产生的影响,并且将解释实例中已存储的方式DATETIME和TIMESTAMP值。
DATETIME
TIMESTAMP
要在MySQL实例启动时设置服务器time_zone,我们可以/etc/my.cnf在以下[mysqld]部分下修改文件(或在读取mysql实例初始化参数的任何位置):
/etc/my.cnf
[mysqld]
[mysqld] default-time-zone='+00:00'
- 要么 -
也可以(不太理想)将--default_time_zone='+00:00'选项添加到mysqld_safe
--default_time_zone='+00:00'
注意: 更改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设置为其他东西一样。)