mysql-connector-java升级到8.0.11会更改从db

时间:2018-04-27 16:34:48

标签: java mysql

对于Spring项目,mysql-connector-java已从6.0.6迁移到8.0.11

因此8.0.11问题如下:

Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: 
The server time zone value 'PET' is unrecognized or represents more than one time zone. 
You must configure either the server or JDBC driver (via the serverTimezone configuration property) 
to use a more specifc time zone value if you want to utilize time zone support.

之后做研究

解决方案是更改URL(我不想返回先前版本)

  • 来自:mysql.jdbcUrl = jdbc:mysql://localhost:3306/web_v01?useSSL=false
  • to:mysql.jdbcUrl = jdbc:mysql://localhost:3306/web_v01?useSSL=false&serverTimezone=UTC

注意添加&serverTimezone=UTC

在我的数据库中,我有以下内容:

mysql> select * from persona;
+-----+--------------+-------------+------------+
| id  | nombre       | apellido    | fecha      |
+-----+--------------+-------------+------------+
...
| 088 | Something    | Something   | 1981-07-06 |
...
+-----+--------------+-------------+------------+

Spring应用程序通过RowMapper<Persona>从数据库检索时,我可以确认rs.getDate("fecha")返回1981-07-05(观察当天减少了一天,它是正确)

如果mysql-connector-java返回6.0.6,因此mysql.jdbcUrl = jdbc:mysql://localhost:3306/web_v01?useSSL=false serverTimezone=UTCrs.getDate("fecha")返回1981-07-06 (预期如何)

因此如何解决这个问题与8.0.11一起使用?

当从一开始就没有声明serverTimezone时,我想要有相同的行为,当然要避免异常。

因此,如果考虑到serverTimezone声明的值无关紧要,那么解决方案会更好。

3 个答案:

答案 0 :(得分:1)

尝试使用

jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=CST

答案 1 :(得分:0)

就我而言,最不可能的嫌疑人是jackson

如果您使用 Spring Boot,请将以下属性添加到 application.properties

spring.jackson.time-zone=Asia/Colombo

我在这里详细回答了这个问题 -> https://stackoverflow.com/a/68016006/9183199

答案 2 :(得分:-1)

有几个与时区相关的属性:

useTimezone: 在客户端和服务器时区之间转换时间/日期类型(是/否,默认为“假”)?这是旧版日期时间代码的一部分,因此,仅当“ useLegacyDatetimeCode = true”时,该属性才有效。 默认值:false

useLegacyDatetimeCode: 使用代码在结果集和语句中处理DATE / TIME / DATETIME / TIMESTAMP的代码,这些结果和语句始终处理从客户端到服务器的时区转换,然后再返回,或者将旧代码用于驱动程序中的这些数据类型以实现向后兼容?将此属性设置为“ false”将使“ useTimezone”,“ useJDBCCompliantTimezoneShift”,“ useGmtMillisForDatetimes”和“ useFastDateParsing”的效果无效。 默认值:true

serverTimezone: 覆盖检测/时区映射。在服务器的时区未映射到Java时区时使用

如果mysql-connector-java为5.1,则应指定三个属性,如下所示: jdbc:mysql:// host:port / dbname?useTimezone = true&useLegacyDatetimeCode = true&serverTimezone = GMT%2B08:00

如果mysql-connector-java为8.0,则应指定一个属性,如下所示: jdbc:mysql:// host:port / dbname?serverTimezone = GMT%2B08:00