我有一个设置为本地时区的MySQL数据库。虽然数据库使用不同的时区,但是时间作为UTC时间插入。我想在MySQL服务器上将时区更改为UTC。我找到了有关如何执行此操作的文档,但我不愿意,因为我不知道这是否也会更改已存储在数据库中的值。
我的问题:更改MySQL服务器的时区是否也会更改已存储的值?
答案 0 :(得分:4)
原则上它不应该。根据您的值的类型,它有多种原因不应该更改:主要是DATETIME和TIMESTAMP。
永远不会转换DATETIME值,因此它们与时区无关。
TIMESTAMP值被转换(从这里直接引用手册---我假设你有一个相当新的MySQL版本)“从当前时区到UTC进行存储,从UTC回到当前时区进行检索。(对于其他类型,例如DATETIME,不会出现这种情况。)默认情况下,每个连接的当前时区是服务器的时间。时区可以基于每个连接进行设置。只要时区设置仍然存在常量,您返回存储的相同值。如果存储TIMESTAMP值,然后更改时区并检索值,则检索的值与您存储的值不同。这是因为未使用相同的时区双向转换。“ (来自http://dev.mysql.com/doc/refman/5.5/en/datetime.html)。
因此,在这两种情况下,实际存储在服务器上的数据都不会发生变化(应该是这样),但是查询显示的值可能会在之前和之后有所不同。
答案 1 :(得分:0)
这取决于您是使用TIMESTAMP
还是DATETIME
列来存储时间戳。
TIMESTAMP
次自动从当地时间(准确地说:从连接的时区设置)转换为将它们存储在MySQL的表中的UTC时间。它们在被检索时从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