【发布时间】:2013-03-11 12:22:43
【问题描述】:
我有一个设置为本地时区的 MySQL 数据库。尽管数据库使用不同的时区,但时间被插入为 UTC 时间。我想在 MySQL 服务器上将时区更改为 UTC。我找到了有关如何执行此操作的文档,但我不情愿,因为我不知道这是否也会更改已存储在数据库中的值。
我的问题:更改 MySQL 服务器的时区是否也会更改已存储的值?
【问题讨论】:
标签: mysql
我有一个设置为本地时区的 MySQL 数据库。尽管数据库使用不同的时区,但时间被插入为 UTC 时间。我想在 MySQL 服务器上将时区更改为 UTC。我找到了有关如何执行此操作的文档,但我不情愿,因为我不知道这是否也会更改已存储在数据库中的值。
我的问题:更改 MySQL 服务器的时区是否也会更改已存储的值?
【问题讨论】:
标签: mysql
原则上不应该。它不应该更改的原因有多种,具体取决于您的值的类型:主要是 DATETIME 和 TIMESTAMP。
DATETIME 值永远不会被转换,因此它们与时区无关。
TIMESTAMP 值已转换(此处直接引用手册 --- 我假设您有一个相当新的 MySQL 版本)“从当前时区转换为 UTC 进行存储,然后从 UTC 返回到当前时区进行检索.(其他类型如DATETIME不会出现这种情况。)默认情况下,每个连接的当前时区是服务器的时间。时区可以在每个连接的基础上设置。只要时区设置保持不变常量,你取回你存储的相同值。如果你存储一个 TIMESTAMP 值,然后更改时区并检索该值,检索到的值与你存储的值不同。发生这种情况是因为没有使用相同的时区用于双向转换。” (来自http://dev.mysql.com/doc/refman/5.5/en/datetime.html)。
因此,在这两种情况下,实际存储在服务器上的数据都不会改变(这是应该的),但是您的查询将显示的值前后可能会有所不同。
【讨论】:
这取决于您是使用TIMESTAMP 还是DATETIME 列来存储您的时间戳。
TIMESTAMP 时间在存储到 MySQL 的表中时会自动从本地时间(准确地说:从连接的时区设置)转换为 UTC 时间。检索它们时,它们会从 UTC 转换为本地时间。
但是DATETIME 时间戳的存储和检索与您的应用程序将它们呈现给 MySQL 完全一样。因此,如果您将默认时区更改为 UTC,然后检索您的 TIMESTAMP 值,您将恢复为 UTC。所以他们看起来像他们改变了。但改变的是自动翻译。
更改 MySQL 默认时区不会改变任何表内容。
您可以通过在连接到 MySQL 时发出以下命令来进行试验。
SET time_zone = '+0:00';
这将更改您的连接的时区设置,而不会更改任何其他内容。
重新配置您知道自己在做什么的生产服务器时要小心:您说“MySQL 数据库 ... 设置为本地时区”。在更改任何内容之前,您需要准确调查它是如何设置的。因为这里是可以影响事物的设置。
(1) 运行 MySQL 服务器软件的服务器计算机上的时钟设置。
(2) 该机器上的时区设置。
(3) 您正在运行的 MySQL 服务器中的默认(也称为全局)时区设置。
在大多数现代服务器中,时钟设置为正确的 UTC 时间,时区设置设置为用户期望的任何本地时区。并且,您的 MySQL 服务器的默认时区设置设置为相同的本地时区。您需要验证这些内容是否正确。
如果您的服务器的时间自动正确地从标准时间转换为夏令时(美国的昨天早上),那么前两个时间可能是正确的。
如果你发出这个 MySQL 命令:SELECT @@global.time_zone' and get back either your local time zone name orSYSTEMthe third is right. Also issueSELECT 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
【讨论】: