背景
因为数据库要升级到 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时区。1TimeZone.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/
有问题或建议欢迎与我联系讨论,转载或引用希望标明出处,感激不尽!