2

我们现在正在将 Spring Boot 应用程序的 MySQL Connector/J 从版本 5 更新到 8(我们实际上正在将 Spring Boot 版本从 2.0 更新到 2.1,但我认为这与我们的问题无关)。

升级连接器后(数据库保持不变:MySQL 5.7),我们发现DATETIME存储在数据库中的所有值都因服务器和客户端之间的时区差异(UTC 和 UTC+1)而发生变化。例如,如果我们尝试读取2019-01-01 02:17:00我们正在获取的值2019-01-01 03:17:00

我们知道新的连接器是使时间偏移的连接器,但我们需要我们的日期与时区无关。根据MySQL 5.7的文档,它看起来像是DATETIME要走的路:

MySQL 将 TIMESTAMP 值从当前时区转换为 UTC 进行存储,并从 UTC 转换回当前时区进行检索。(这不会发生在其他类型中,例如DATETIME.)

我们现在唯一能做的就是将连接器降级到以前的版本,或者将所有DATETIME列更改为BIGINT.

有没有办法在 MySQL 中存储没有任何时区自动转换的日期和时间?

4

2 回答 2

2

将时区添加到连接字符串应该可以解决这个问题。尝试将以下文本添加到您的连接 URL:

useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CET
于 2019-09-02T12:10:53.407 回答
1

过去我使用这个技巧来确保有效的服务器时区与客户端时区相同:

String connectionUrl = "jdbc:mysql://localhost:3307/mydb?useUnicode=true"
            + "&serverTimezone=" + ZoneId.systemDefault().getId();
System.out.println(connectionUrl);
// jdbc:mysql://localhost:3307/mydb?useUnicode=true&serverTimezone=America/Denver

Connection conn = DriverManager.getConnection(connectionUrl, myUid, myPwd);
于 2019-09-02T14:47:53.400 回答