我们已经将我们的应用程序从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应用时间戳值。所以在检索时间戳时,我们得到的是不正确的值。
感谢任何建议。
我也有同样的问题,通过安装新版本(8.0.20)的ConnectorJ 8驱动解决了这个问题。https:/dev.mysql.comdocrelnotesconnector-j8.0ennews-8-0-20.html。