2013-03-11 103 views
1

我有一个设置为本地时区的MySQL数据库。时间插入为UTC时间,尽管数据库使用不同的时区。我想在MySQL服务器上将时区更改为UTC。我找到了关于如何做到这一点的文档,但我不愿意,因为我不知道这是否也会改变已存储在数据库中的值。会更改数据库中DateTime字段的MySQL时区更改值吗?

我的问题:更改MySQL服务器的时区是否也会改变已存储的值?

回答

4

原则上不应该。有多种原因不应该改变,具体取决于值的类型:主要是DATETIME和TIMESTAMP。

DATETIME值从不转换,因此它们独立于时区。

TIMESTAMP值将从当前时区转换为UTC(用于存储),并从UTC返回到当前时区,以便转换(从此处的直接引用---我假设您有一个相当新的MySQL版本) (对于其他类型,例如DATETIME,这种情况不会发生)默认情况下,每个连接的当前时区是服务器的时间,时区可以基于每个连接设置,只要时区设置如果存储TIMESTAMP值,然后更改时区并检索该值,则检索到的值将与您存储的值不同,这是因为同一时区不是用于双向转换。“ (来自http://dev.mysql.com/doc/refman/5.5/en/datetime.html)。

因此,在这两种情况下,实际存储在服务器上的数据都不会改变(这是它应该是的),但查询显示的值可能会在前后不同。

+0

所以,如果我读正确,因为我使用的DATETIME值,而不是时间戳值,如果我改变了服务器的时区,这将不会对查询的任何影响 – Richard 2013-03-11 13:10:28

+0

理查德,是的,我明白这一点。现在,如果你可以设置一个测试服务器,你可以试试它是完全确定的,但是即使没有执行测试,我也没有看到MySQL存储的数据如果没有明确地做,就不能改变。 – lmsteffan 2013-03-11 13:21:46

+0

@理查德,我不熟悉夏令时在MySQL中的处理(这就是你的意思是“春季飞跃前进”,对吧?),但是你确定它确实会改变储存值吗?它可能是你(可能)使用的连接器,它们呈现这些值的方式不同吗? – lmsteffan 2013-03-11 18:05:06

0

这取决于您是使用TIMESTAMP还是DATETIME列来存储您的时间戳。

TIMESTAMP时间自动从本地时间(精确地:从连接的时区设置)转换为UTC时间,当它们存储在MySQL表中时。当它们被检索时,它们会从UTC转换到当地时间。

但是DATETIME时间戳存储和检索完全按照您的应用程序呈现给MySQL。因此,如果您将默认时区更改为UTC,然后检索TIMESTAMP值,则会以UTC形式返回。所以他们会看起来像他们改变。但是改变的是自动翻译。

更改MySQL默认时区不会更改任何表内容。

您可以通过在连接到MySQL时发出以下命令来进行试验。

SET time_zone = '+0:00'; 

这将改变您的连接的时区设置而不会改变其他任何东西。

重新配置生产服务器时要小心,您知道自己在做什么:您说您的“MySQL数据库...设置为本地时区”。您需要在更改任何内容前仔细调查设置。因为这是可能影响事物的设置。 (1)运行MySQL服务器软件的服务器上的时钟设置。

(2)该机器上的时区设置。 (3)运行MySQL服务器时的默认(aka全局)时区设置。

在大多数现代服务器中,时钟设置为正确的UTC时间,时区设置设置为用户期望的任何本地时区。而且,MySQL服务器的默认时区设置被设置为相同的本地时区。您需要验证这些事情是否正确。

如果您的服务器的时间自动正确地从标准时间翻转到夏令时(昨天早上在美国),前两个可能是正确的。

如果你发出这个MySQL命令:SELECT @@global.time_zone' and get back either your local time zone name or SYSTEM the third is right. Also issue SELECT NOW()`来仔细检查。如果你在一天的正确时间,你的系统可能没问题。最后,发出这两个命令:

SET time_zone = '+0:00'; 
SELECT NOW(); 

如果您从系统中获得正确的当前UTC时间,那么一切都是已知的和良好的状态,你已准备好进行时区切换。

通过更改MySQL配置文件中的system_time_zone变量并重新启动MySQL服务器来创建交换机。在这里看到的方向:

http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html