SpringBoot 连接 MySQL 8.0 的时区问题

背景

因为数据库要升级到 MySQL 8.0 所以要对架构做升级,主要的修改工作如下:

  • 驱动包要升级为 mysql-connector-java-8.0.11.jar

  • JDBC driver 由 com.mysql.jdbc.Driver 改为 com.mysql.cj.jdbc.Driver

  • JDBC url 中加上 userSSL=false

问题

升级以后发现通过 Mybatisplus 从数据库获取的时间字段值和数据库的值会有几小时的差异,这其实是程序所在时区和数据库的时区不一致导致的。

解决方法

解决方案有两个

修改程序默认时区

通过代码将程序的系统默认时区改成和数据库的时区一致,如果数据库时区为0时区,那需要将程序的系统时区改成0时区。

1
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"))

修改数据库时区

通过在JDBC url 增加参数,使数据库时区和程序系统时区一致:

如果你是在本地运行代码,在 JDBC url 加上 &serverTimezone=Asia/Shanghai 或者 &serverTimezone=GMT%2B8

如果你的程序是在服务器上运行,则加上&serverTimezone={服务器的时区},0时区的话就是UTC。

参考资料


文章标题:连接 MySQL 8.0 的时区问题
文章作者:Ciel Ni
文章链接:http://www.cielni.com/2021/09/30/mysql8-timezone/
有问题或建议欢迎与我联系讨论,转载或引用希望标明出处,感激不尽!

Ciel Ni wechat
如有疑问或建议欢迎加微信讨论