我们现在正在将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中是否可以通过任何方式存储日期和时间而无需任何时区自动转换?
答案 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);