我需要更改单个数据库的时区,这可能吗?
我知道我们可以在WHM中更改时区(我们使用的是hostgator的专用服务器),但是服务器上运行的大量遗留软件中有很多+6小时的编码(即服务器时区是CST,我们希望时间是GMT,所以以前的开发人员在代码中手动更改日期/时间-糟糕!)。
我现在正在开发一个新软件,希望在GMT中完成,我知道我可以使用date_default_timezone_set("GMT"),但这不会解决MySQL插入的问题,因为它将插入@CST时区,而将日期时间列设置为CURRENT_TIMESTAMP。
不,不可能在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'
--或--
在mysqld_safe 中添加--default_time_zone='+00:00'
选项也是可能的(不太可取)
注意:更改MySQL服务器上的时区设置不会更改存储在现有DATETIME或TIMESTAMP列中的值,但由于它确实有效地更改了解释这些存储值的上下文,因此看起来所有值都发生了偏移。(其中08:00被取为上午8点CST,服务器的时区从CST更改为GMT,相同的"08:00"现在将被取为早上8点GMT,实际上是凌晨2点CST。
还要记住,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却设置为其他值一样。)
如果不能更改当前时区,则可以更改结果。
日期2015-01-05 12:06:16
Select date + Interval 2 Hour 'date' From ExampleTable
日期2015-01-05 14:06:16
您可以修改默认值,而不是输入current_timestamp,使其插入添加到时区小时偏移量的current_timestamp。当我没有找到任何解决方案时,我就这样做了,不得不发明自己的解决方案。