【问题标题】:Fetched timestamp field via MySQL Connector/J 8.0.23 is incorrect通过 MySQL Connector/J 8.0.23 获取的时间戳字段不正确
【发布时间】: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=UTCforceConnectionTimeZoneToSession=truepreserveInstants=true——但这个版本似乎没有任何效果。

我在这里遗漏了什么,还是这看起来像是一个错误? FWIW, no bug is listed 涵盖了这一点。

【问题讨论】:

  • TIMESTAMP 是一种构思不当的数据类型。它表示服务器时区中的时间戳。如果服务器时区更改,或者您备份/恢复到不同的服务器,MySQL 可能会损坏数据。除此之外,TIMESTAMP 将在 2038 年用完值。尽可能尝试使用DATETIME
  • 感谢您提供的信息,我会将其添加到我们应该解决的问题列表中! :)
  • 是的,在 8.0.23 版本中对时间类型处理进行了大规模重构。请提交一个错误,提供尽可能多的详细信息和完整的测试用例。您在此处提供的信息不足以帮助您。

标签: java mysql mysql-5.7


【解决方案1】:

您也可以查看https://insidemysql.com/support-for-date-time-types-in-connector-j-8-0/了解更多详情。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多