使用 MySQL Connector/J 8.0 在 MySQL 中存储和检索没有任何时区信息的日期
Store and retrieve a date in MySQL without any timezone information using MySQL Connector/J 8.0
我们现在正在将 Spring 启动应用程序的 MySQL Connector/J 从版本 5 更新到版本 8(我们实际上正在更新 Spring 启动版本从 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 but we need our dates to be timezone independent. According to the documentation of MySQL 5.7 看起来 DATETIME
是要走的路:
MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME
.)
我们现在唯一能做的就是将连接器降级到以前的版本,或者将所有 DATETIME
列更改为 BIGINT
。
在 MySQL 中有没有任何方法可以在不进行任何时区自动转换的情况下存储日期和时间?
在连接字符串中添加时区应该可以解决这个问题。尝试将以下文本添加到您的连接 url:
useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CET
过去我使用这个技巧来确保有效的服务器时区与客户端时区相同:
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);
我们现在正在将 Spring 启动应用程序的 MySQL Connector/J 从版本 5 更新到版本 8(我们实际上正在更新 Spring 启动版本从 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 but we need our dates to be timezone independent. According to the documentation of MySQL 5.7 看起来 DATETIME
是要走的路:
MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as
DATETIME
.)
我们现在唯一能做的就是将连接器降级到以前的版本,或者将所有 DATETIME
列更改为 BIGINT
。
在 MySQL 中有没有任何方法可以在不进行任何时区自动转换的情况下存储日期和时间?
在连接字符串中添加时区应该可以解决这个问题。尝试将以下文本添加到您的连接 url:
useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CET
过去我使用这个技巧来确保有效的服务器时区与客户端时区相同:
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);