使用MySQL Connector / J 8.0在MySQL中存储和检索日期而没有任何时区信息

时间:2019-09-02 11:26:55

标签: java mysql jdbc connector-j

我们现在正在将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

我们知道,新连接器是time shift的连接器,但是我们需要使日期与时区无关。根据{{​​3}}的文档,看来DATETIME是可行的方式:

  

MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,然后从UTC返回当前时区进行检索。 (对于其他类型,例如DATETIME,则不会发生这种情况。)

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

在MySQL中是否可以通过任何方式存储日期和时间而无需任何时区自动转换?

2 个答案:

答案 0 :(得分:1)

在连接字符串中添加时区可以解决此问题。尝试在您的连接网址中添加以下文本:

useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CET

答案 1 :(得分: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);