更改MySQL时区会改变数据库中DateTime字段的值吗?

更改MySQL时区会改变数据库中DateTime字段的值吗?,mysql,Mysql,我有一个设置为本地时区的MySQL数据库。时间作为UTC时间插入,尽管数据库使用不同的时区。我想在MySQL服务器上将时区更改为UTC。我已经找到了关于如何做到这一点的文档,但我不太情愿,因为我不知道这是否也会改变数据库中已经存储的值 我的问题:更改MySQL服务器的时区是否也会更改已存储的值?原则上不应该。根据值的类型,它不应该更改的原因有很多:主要是DATETIME和TIMESTAMP DATETIME值从不转换,因此它们独立于时区 时间戳值将从当前时区转换为UTC存储,并从UTC返回到当前

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


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

原则上不应该。根据值的类型,它不应该更改的原因有很多:主要是DATETIME和TIMESTAMP

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

时间戳值将从当前时区转换为UTC存储,并从UTC返回到当前时区进行检索(此处直接引用手册——我假设您有一个相当新的MySQL版本)。(对于其他类型,如DATETIME,不会发生这种情况。)默认情况下,每个连接的当前时区是服务器的时间。可以在每个连接的基础上设置时区。只要时区设置保持不变,就可以返回存储的相同值。如果存储时间戳值,然后更改时区并检索值,则检索到的值与va不同您存储的lue。发生这种情况是因为在两个方向上转换时未使用同一时区。“(来自)


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

这取决于您是使用
时间戳
还是
日期时间
列来存储时间戳

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

但是
DATETIME
时间戳的存储和检索与应用程序向MySQL呈现的时间戳完全相同。因此,如果您将默认时区更改为UTC,然后检索
时间戳
值,您将以UTC返回这些值。所以他们看起来就像变了一样。但改变的是自动翻译

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

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

 SET  time_zone = '+0:00';
这将在不更改任何其他内容的情况下更改连接的时区设置

在重新配置生产服务器时要小心,因为您知道自己在做什么:您说您的“MySQL数据库…已设置为本地时区”。在更改任何内容之前,您需要仔细研究该数据库是如何设置的。因为这里有一些可以影响事情的设置

(1) 运行MySQL服务器软件的服务器计算机上的时钟设置

(2) 那台机器上的时区设置

(3) 正在运行的MySQL服务器中的默认(也称为全局)时区设置

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

如果您的服务器的一天中的时间自动正确地从标准时间切换到夏令时(美国的昨天早上),那么前两个可能是正确的

如果您发出此MySQL命令:
选择@global.timeu_zone'并返回您的本地时区名称或
SYSTEM
第三个是正确的。同时发出
SELECT NOW()`进行双重检查。如果你找到了一天中正确的时间,你的系统可能会很好。最后,发出以下两个命令:

 SET  time_zone = '+0:00';
 SELECT NOW(); 
如果您从系统中获得当前正确的UTC时间,那么一切都是已知的良好状态,您已经准备好进行时区切换

通过更改MySQL配置文件中的
system\u time\u zone
变量并重新启动MySQL服务器来进行切换。有关说明,请参见此处:


因此,如果我阅读正确,因为我使用的是日期时间值,而不是时间戳值,如果我更改服务器的时区,这对查询没有任何影响Richard,是的,我完全是这样理解的。现在,如果您可以设置一个测试服务器,您可以尝试完全确定,但即使不执行测试,我也看不出如果您不明确地执行测试,MySQL存储的数据是如何更改的。@Richard,我不熟悉MySQL中夏令时的处理方法(这就是您所说的“spring leap ahead”的意思),对吗?),但您确定它确实更改了存储值吗?是否是您(可能)使用的连接器以不同方式表示这些值?