参考:

https://www.jb51.net/database/3014537d0.htm

mysql 里 CST 时区是个非常坑的概念,因为在 mysql 里CST既表示中国也表示美国的时区。

但是在Jdk代码里,CST 这个字符串被理解为Central Standard Time (USA)(GMT-6),这就是造成坑的原因。

解决办法:

mysql 的 time_zone配置 不要用SYSTEM,因为用了就是跟随 system_time_zone 的值,而 system_time_zone 读取自数据库所在宿主机的操作系统,常常是 CST 的值。

解决办法是将 time_zone 改成例如 +08:00 以免造成误解

二、查看、修改时区

1、怎么查看mysql是什么时区?

选一个即可

方法1:

命令: 连上mysql后命令行执行 show variables like '%time_zone%' (Navicat连上后执行也行)

结果:

system_time_zone  CST``time_zone  SYSTEM

看time_zone就行了,SYSTEM表示其值跟随system_time_zone。

而system_time_zone的CST值,是表示中国呢,还是美国,是不清楚的,你直接再执行 select now() 跟你手机的时间对比一下就清楚了。

为什么会system_time_zone和time_zone两个? 要看哪个? 不急后面会解释

方法2:

命令:连上mysql后命令行执行 (Navicat连上后执行也行)

// 分两次执行下面2条命令``select` `@@system_time_zone;``select` `@@time_zone;

结果:

select` `@@system_time_zone;``+``--------------------+``| @@system_time_zone |``+``--------------------+``| CST        |``+``--------------------+``1 row ``in` `set` `(4.81 sec)``mysql> ``select` `@@time_zone;``+``-------------+``| @@time_zone |``+``-------------+``| SYSTEM   |``+``-------------+``1 row ``in` `set` `(0.04 sec)

方法3:

// 查出全局时区和会话时区``select` `@@``GLOBAL``.time_zone,@@SESSION.time_zone;

为什么mysql有system_time_zone和time_zone两个

https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html

简单说就是system_time_zone就是mysql服务(即mysqld)启动的时候读取数据库所在宿主机的时区,固定下来的值,这个值之后不再改变(除非重启mysql服务)。time_zone的值未SYSTEM,意思是它的时区跟system_time_zone一样(注意system_time_zone的值固定下来后,数据库宿主机的时区再改变,time_zone的值都是不变的,因为它是跟随system_time_zone变量的,不是实时跟随操作系统的)

存在 “为什么linux时区是对的,但是mysql的时区是错的” 的疑惑,因为启动mysql服务时如果linux时区是错的,把mysql的时区也带错了,只是后来你发现linux时区错了于是改对了,但是你忘记启动mysql的时候linux时区是错的,而且你忘了是后来你才把linux的时区改正确的,所以你有这个的疑惑。我好像也有过这样的疑惑

2、如何修改mysql的时区

永久修改,改配置文件,重启mysql服务也有效

修改 my.cnf 文件,在 [mysqld] 节下增加 default-time-zone = '+08:00'

没有这个文件的话,见后文,让你的mysql启动的时候读取配置文件。

临时修改,重启mysql服务后丢失

选择下面之一执行即可。

  • 修改会话级别定的,关闭会话后就会失效,也仅仅影响当前会话窗口:set time_zone='+08:00';
  • 全局修改,重启mysql服务后丢失,对所有会话生效:`set global time_zone=’+08:00’;