MySql的时区(serverTimezone)引发的血案

Posted 技术改变生活

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql的时区(serverTimezone)引发的血案相关的知识,希望对你有一定的参考价值。

前言

mysql8.x的jdbc升级了,增加了时区(serverTimezone)属性,并且不允许为空。

血案现场

配置jdbc的URL:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true

应用运行一段时间后,发现数据库中登记的时间和正常的时间不一致。

查询表字段值:

 

 而现在电脑的时间是:

 

 问题排查

1、服务器时间不同步

使用命令:date,查看linux服务器时间

[root@abc ~]# date
Sat Mar  7 18:43:30 CST 2020

服务器的机器时间没有问题

2、程序问题

uLog.setLogTime(new Date());

程序是使用的机器时间,不会有问题

3、数据库时间

查看数据库时间:select sysdate()

mysql> select sysdate();
+---------------------+
| sysdate()           |
+---------------------+
| 2020-03-07 18:48:01 |
+---------------------+
1 row in set

时间也是没有问题,最后考虑到jdbc增加了时区属性

问题根源

UTC是什么时区

不属于任意时区  。协调世界时,又称世界统一时间,世界标准时间,国际协调时间,简称UTC。

时区(Time Zone)是地球上的区域使用同一个时间定义。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。在中国采用首都北京所在地东八区的时间为全国统一使用时间。

例:已知东京(东九区)时间为5月1日12:00,求北京(东八区)的区时?北京时间=12:00-(9-8)=11:00(即北京时间为5月1日11:00)。

 

问题找到了,就是时区字段的问题

解决方法

修改jdbc时区,改成服务器所在地的真实时区

修改前:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
修改后:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true

重启应用,发现时间是正确的

+---------------------+
| log_time            |
+---------------------+
| 2020-03-07 19:04:06 |
| 2020-03-07 19:04:03 |
| 2020-03-07 19:04:03 |
| 2020-03-07 19:04:03 |
| 2020-03-07 19:04:03 |
| 2020-03-07 19:04:03 |
| 2020-03-07 19:04:02 |
| 2020-03-07 19:04:02 |
| 2020-03-07 19:03:51 |
| 2020-03-07 10:40:35 |
| 2020-03-07 10:40:35 |
| 2020-03-07 10:40:35 |

以上是关于MySql的时区(serverTimezone)引发的血案的主要内容,如果未能解决你的问题,请参考以下文章

Jdbc Driver驱动和ServerTimeZone时区的的问题

mysql-connector-java 6.0.X serverTimezone 时区设置

idea Auto import​errorCode 0, state 08001Autowired用法详解mysql时区问题 serverTimezone=Asia/Shanghai

Java与MySQL时间戳传递/存储/协调问题--userLegacyDatetimeCode--userTimezone--serverTimezone

解决mysql时区问题以及SSL问题

关联mysql失败_Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon&#