MySQL 8服务器使用mysql-connector-java jdbc驱动8.0.18获得时间戳列的不正确值。

问题描述 投票:3回答:1

我们已经将我们的应用程序从MySQL 5.1.6迁移到MySQL 8.0.16。

当使用mysql-connector-java jdbc驱动(版本8.0.18,8.0.19)从MySQL 8服务器检索时间戳列时,我们得到的日期值不正确,这是夏令时(DST)。

我们托管java应用程序的服务器和MySQL数据库都是在EST。

在这里,我们有一个列 created_date 类型为datetime。它的值是'2020-03-17 23:01:54'。当通过JDBC检索相同的数据为。

Timestamp timestamp = resultSet.getTimestamp("created_date"); 

我们得到的值是2020-03-18 00:01:54.0,即DST被应用。

在MySQL中存在一个已知的错误。https:/dev.mysql.comdocconnector-j8.0enconnector-j-usagenotes known-issues-limitations.html。

它建议在jdbc url中添加额外参数serverTimezone=UTC。但是我们不能使用UTC,因为我们想在应用数据库中使用特定的部署时区。

注:我们在MySQL 5.1中没有遇到这个问题。

额外的更新:当我在数据库中插入数据时,如果我使用jdbc url和参数serverTimezone=UTC,那么当检索时间戳列时,我得到了正确的值。

所以似乎在serverTimezone=UTC的情况下,JDBC驱动在数据库中存储时间戳时没有应用DST。所以建议的变通方法(即serverTimezone=UTC)似乎是有效的。

但是,如果我使用包含serverTimezone=UTC的JDBC url,使用Load Data Local文件命令插入数据,即

PreparedStatement stmt = connection.prepareStatement("LOAD DATA LOCAL INFILE.....")

似乎serverTimezone=UTC标志被忽略了&数据被存储与DST应用时间戳值。所以在检索时间戳时,我们得到的是不正确的值。

感谢任何建议。

java mysql jdbc
1个回答
2
投票

我也有同样的问题,通过安装新版本(8.0.20)的ConnectorJ 8驱动解决了这个问题。https:/dev.mysql.comdocrelnotesconnector-j8.0ennews-8-0-20.html。

© www.soinside.com 2019 - 2024. All rights reserved.