MySql数据库时区异常


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

Author: Doctor-Deng
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Doctor-Deng !
 Previous
找不到 Jdbc 驱动 找不到 Jdbc 驱动
Cannot find class: com.mysql.cj.jdbc.Driver今天遇到一个超级简单的问题,却在搜索引擎里找了半天。 我的调试 BUG 能力还是有待增加 一、错误重现错误是找不到 jdbc 的 class 文件,但是我
2020-03-17 Doctor-Deng
Next 
Idea 导入项目报错 Idea 导入项目报错
关于 Idea 导入项目可能会报出的错误Error:(1, 1) java: 非法字符: ‘\ufeff’ Error:(1, 10) java: 需要class, interface或enum 这个问题其实是在昨天遇到的,只不过昨天
2020-03-14 Doctor-Deng
  TOC