【问题标题】:Will changing a MySQL timezone change values of DateTime fields in a database?更改 MySQL 时区会更改数据库中 DateTime 字段的值吗?
【发布时间】:2013-03-11 12:22:43
【问题描述】:

我有一个设置为本地时区的 MySQL 数据库。尽管数据库使用不同的时区,但时间被插入为 UTC 时间。我想在 MySQL 服务器上将时区更改为 UTC。我找到了有关如何执行此操作的文档,但我不情愿,因为我不知道这是否也会更改已存储在数据库中的值。

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

    DATETIME 值永远不会被转换,因此它们与时区无关。

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

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

    【讨论】:

    • 所以如果我阅读正确,因为我使用的是 DATETIME 值,而不是 TIMESTAMP 值,如果我更改服务器的时区,这不会对查询产生任何影响
    • 理查德,是的,我就是这么理解的。现在,如果您可以设置一个测试服务器,您可以完全确定地尝试它,但即使没有执行测试,我也看不出如果没有您明确地执行,MySQL 存储的数据是如何更改的。
    • @Richard,我不熟悉 MySQL 中夏令时的处理(这就是你所说的“春天的飞跃”,对吧?),但你确定它真的改变了存储的价值?是否是您(可能)使用的连接器以不同方式呈现这些值?
    【解决方案2】:

    这取决于您是使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 2020-09-09
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      相关资源
      最近更新 更多