Java 通过MySQL连接器/J 8.0.23获取的时间戳字段不正确

Java 通过MySQL连接器/J 8.0.23获取的时间戳字段不正确,java,mysql,mysql-5.7,Java,Mysql,Mysql 5.7,在数据源URL中,我们包括serverTimezone=UTC,并且服务器也在UTC中运行。我们使用的是连接器的6.0.6版,在时间戳字段返回数据库时没有问题。但是,升级到版本8.0.23会导致时间戳字段不正确 Expected :2018-09-18T00:00:00Z Actual :2018-09-17T04:00:00Z 这是在往返数据库(MySQL 5.7)之后,请注意,数据库中的字段是TIMESTAMP,在Java端是Instant 我用一堆不同的8.x版本的MySQL Con

在数据源URL中,我们包括
serverTimezone=UTC
,并且服务器也在UTC中运行。我们使用的是连接器的
6.0.6版
,在
时间戳
字段返回数据库时没有问题。但是,升级到版本
8.0.23
会导致
时间戳
字段不正确

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=用户定义时区并保持其不变的用户(无需配置新连接属性)可以预期与以前相同的行为,但建议进行测试

我已尝试使用多种选项更新连接字符串,例如
connectionTimeZone=UTC
forceConnectionTimeZoneToSession=true
preserveInstants=true
——但此版本似乎不起作用

我是不是漏掉了什么东西,还是这看起来像个虫子?FWIW,它涵盖了这一点。

您还可以查看更多详细信息


对于从c/J 6.0.6进行的迁移,额外设置preserveInstants=true就足够了。但问题是如何存储和检索即时数据,Connector/J对此没有内置支持。Connector/J 8.0.23仅在某些情况下保留瞬间值,请查看“保留瞬间”一章,可能您需要使用不同的getter。

时间戳
是一种考虑不周的数据类型。它表示服务器时区中的时间戳。如果服务器时区发生变化,或者您备份/恢复到其他服务器,MySQL可能会损坏数据。除此之外,
TIMESTAMP
将在2038年用完。尽可能使用
DATETIME
。感谢您提供的信息,我会将其添加到我们应该解决的问题列表中:)是的,在版本8.0.23中,在时态类型处理方面进行了大量重构。请提交一个bug,提供尽可能多的细节和完整的测试用例。你在这里提供的信息不足以帮助你。