【发布时间】:2021-03-07 02:55:38
【问题描述】:
在数据源 URL 中我们包含serverTimezone=UTC,并且服务器也以 UTC 运行。我们使用的是连接器的6.0.6 版本,并且TIMESTAMP 字段在它们进入数据库时返回没有问题。但是,升级到版本8.0.23 会导致TIMESTAMP 字段不正确;
Expected :2018-09-18T00:00:00Z
Actual :2018-09-17T04:00:00Z
这是在往返于数据库 (MySQL 5.7) 之后,注意数据库中的字段是 TIMESTAMP,而在 Java 端它是 Instant。
我用一堆不同的 8.x 版本的 MySQL Connector/J 对此进行了测试,发现除了最新的 8.0.23 之外,它在我测试的所有版本中都可以正常工作。
查看此版本的发行说明,他们指出了对时区处理的一些更改:
奇怪的是补丁版本会引入这样的变化!然而,他们声明我们连接的方式应该导致与以前相同的行为(尽管它没有):
具有 serverTimeZone=user-defined-time-zone 并保持不变的用户,无需配置新的连接属性,可以预期与以前相同的行为,但建议进行测试。
我尝试使用各种选项更新连接字符串,例如connectionTimeZone=UTC、forceConnectionTimeZoneToSession=true、preserveInstants=true——但这个版本似乎没有任何效果。
我在这里遗漏了什么,还是这看起来像是一个错误? FWIW, no bug is listed 涵盖了这一点。
【问题讨论】:
-
TIMESTAMP是一种构思不当的数据类型。它表示服务器时区中的时间戳。如果服务器时区更改,或者您备份/恢复到不同的服务器,MySQL 可能会损坏数据。除此之外,TIMESTAMP将在 2038 年用完值。尽可能尝试使用DATETIME。 -
感谢您提供的信息,我会将其添加到我们应该解决的问题列表中! :)
-
是的,在 8.0.23 版本中对时间类型处理进行了大规模重构。请提交一个错误,提供尽可能多的详细信息和完整的测试用例。您在此处提供的信息不足以帮助您。