MySql数据库时区异常
一、错误出现
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents mor
二、解决办法
经过网上的一些资料,再查询了 MySQL JDBC URL 参数
解决方法一:在配置 JDBC 的地方,在 url 字符串连接后面加上 ?serverTimeZone=Asia\Shanghai
比如: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
解决方法二:修改 Mysql 数据库配置,需要 DBA 的 root 权限
使用管理员权限(root)用户登录 mysql
查看时区值: show variables like ‘%time_zone%’;
设置为东八区(北京时间) set global time_zone=’+8:00’;
解决方法三:可以在 pom.xml 的数据库依赖里面降低 mysql jdbc 驱动的版本号
使用低版本的MySQL jdbc驱动,5.1.47 不会存在时区的问题
三、问题出现原因
在事后分析代码时,发现就是 pom.xml 里面的 mysql jdbc 驱动的版本太高
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
只要降低到 5.1.47 就不会有这个数据库时区问题的出现,也就是上文的解决方案三。
那么这里提供一些 MySQL JDBC URL 参数,可以帮助你理解解决方案一的参数。
属性名 | 定义 | 要求 | 默认值 | 版本号 |
---|---|---|---|---|
useSSL | 与服务器进行通信时使用SSL(真/假),默认值为“假”。 | No | false | 3.0.2 |
serverTimezone | 覆盖时区的检测/映射。当服务器的时区为映射到Java时区时使用。 | No | 3.0.2 | |
characterEncoding | 如果“useUnicode”被设置为“真”,处理字符串时,驱动程序应使用什么字符编码? 默认为“autodetect”。 | No | 1.1g |