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.

在使用 SpringBoot+jdbcTemplate 连接 MySQL 数据库时出现如下报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' 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.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85)
at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132)
at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2118)
at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2142)
at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1310)
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:967)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
... 48 more

报错提示很明确,JDBC driver 需要添加 serverTimezone 配置项。所以在配置 JDBC 连接时在 url 中添加参数即可:

1
2
3
4
5
6
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
driver-class-name: com.mysql.jdbc.Driver
username: root
password:

问题是之前使用 SpringBoot1.5.8 时不会有这样的问题,升级到 SpringBoot2.2.5 却有这样的问题。

后来查阅资料才知道,MySQL 的 JDBC 驱动从 6.0 版本以上就必须设置 serverTimezone 参数。而 SpringBoot1.5.8 使用的是 5.1.44 版本,SpringBoot2.2.5 使用的是 8.0.19 版本。看来以后项目升级版本还是要谨慎,这就是潜在的坑啊。

在设置 serverTimezone 时也要注意,我们是在东八区,所以需要设置成 GMT%2B8 或 Asia/Shanghai,不要设置成 GMT 或 UTC 了。