我们可以使用如下查询语句查询MySQL使用的时区:
1 2 |
show variables like "%time_zone%"; SELECT @@GLOBAL.time_zone, @@SESSION.time_zone; |
例如:
1 2 3 4 5 6 7 8 |
> show variables like "%time_zone%"; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | CST | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec) |
其中,time_zone=SYSTEM说明MySQL使用SYSTEM的时区,而system_time_zone=CST说明SYSTEM使用CST时区。
1 2 3 4 5 6 7 |
> SELECT @@GLOBAL.time_zone, @@SESSION.time_zone; +--------------------+---------------------+ | @@GLOBAL.time_zone | @@SESSION.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 1 row in set (0.05 sec) |
其中,分别为全局使用的时区和当前session使用的时区。我们可以按如下的方式分别设置全局及session使用的时区:
1 2 3 4 5 6 7 |
#设置全局时区,即时生效,作用于所有session mysql> set global time_zone='+8:00'; Query OK, 0 rows affected (0.00 sec) #设置当前session时区,即时生效,但仅作用于当前session mysql> set time_zone='+8:00'; Query OK, 0 rows affected (0.00 sec) |
当然,当使用SYSTEM时,由于CST本身可以表示中国标准时(UTC+08:00),因此在使用中也是没有任何问题的。事实上,CST时区居然能够表示四种时区,分别为:
- 美国中部时间,Central Standard Time (USA),UTC-06:00
- 澳大利亚中部时间,Central Standard Time (Australia),UTC+09:30
- 中国标准时,China Standard Time,UTC+08:00
- 古巴标准时,Cuba Standard Time,UTC-04:00
由于CST存在歧义,所以导致Java通过JDBC去获取时区的时候,通常会把CST解析为GTM+3时区。例如在Debezium就会错误地处理:
在jdbc连接配置上添加以下两个配置即可:
1 2 3 |
useTimezone=true&serverTimezone=GMT%2B8 或 useTimezone=true&serverTimezone=Asia/Shanghai(推荐) |
这样Debezium获取到的时间戳就是正确的了:
转载时请保留出处,违法转载追究到底:进城务工人员小梅 » MySQL与Debezium的时区问题