MySQL时区问题

现象

MySQL中村的数据是2017-05-05 21:23:58,mybatis读取出来的时间是2017-05-06 10:23:58,我估计是Navicat根据当前系统时区自动做了转换,真正的时间其实还是2017-05-06 10:23:58,关于详细的说明,请参考第二条参考链接

解决办法

根据现象描述,这个问题是由于MySQL时区问题导致的,要解决当然要修改时区了

自行安装MySQL

查看MySQL时区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> select now();
+-----------+
| now() |
+-----------+
| 22:27:19 |
+-----------+
> show variables like "%time_zone%";
+------------------+--------+
| Variable_name  | Value |
+------------------+--------+
| system_time_zone | CST  |
| time_zone    | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
#time_zone说明mysql使用system的时区,system_time_zone说明system使用CST时区
修改MySQL时区

包含以下两种方法:

  • 临时修改(MySQL重启后失效)

    1
    2
    3
    set global time_zone = '+8:00'; #修改mysql全局时区为北京时间,即我们所在的东8区
    set time_zone = '+8:00'; #修改当前会话时区
    flush privileges; #立即生效
  • 修改my.cnf

    1
    2
    3
    4
    vim /etc/my.cnf
    #在[mysqld]区域中加上
    default-time_zone = '+8:00'
    # /etc/init.d/mysqld restart #重启mysql使新时区生效

阿里云RDS(MySQL5.7以下)

注意:只有RDS-MySQL5.5、5.6支持

参考:https://help.aliyun.com/knowledge_detail/41689.html

阿里云RDS(MySQL5.7)

阿里云RDS MySQL5.7不支持修改服务器参数

这个时候我们可以从代码层面修正时区,可以使用在jdbc链接中指定时区参数serverTimezone=Asia/Shanghai

1
database.url=jdbc:mysql://rm-abcdefghijkl.mysql.rds.aliyuncs.com:3306/mydb?serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&useSSL=false&allowMultiQueries=true

参考

我知道是不会有人点的,但万一有人想不开呢!