mysql 时区问题

1.问题源自何处?
之前用的mysql 8.0以上的版本连接时都需要在url后面加 serverTimezone=UTC

<property name="url" value="jdbc:mysql://localhost:3306/db2?serverTimezone=UTC" />
实际上是指出核数据库的时区为美国。因为我们的数据库的时区是美国的,而我们连接的时候用的是中国的北京时间,然后比美国早上8个小时,然后呢用的时候就必须指出我们当前用的时间是美国的时间,这样才能连接上数据库。

2.那么可不可以直接将数据库的默认时区改到中国呢?

当然是可以的,如果是windows系统,在mysql解压路径下的 my.ini 文件的 [mysqld] 里面加上 default-time-zone=’+8:00’ ;
改了之后那么现在就可以直接用 “裸url了”。

<property name="url" value="jdbc:mysql://localhost:3306/db2" />

mysql 使用了UTC方式来记录日志时间,也就是说这是个世界统一时间,存入mysql中的时间只能是UTC时间。mysql的timestamp类型数据,存储的时候会转化成UTC时间戳,读取时再从UTC转化为本地时间戳。各地的标准时间为格林威治时间(G.M.T)加上 (+) 或减去 (-) 时区中所标的小时和分钟数时差。中国是GMT+8.

1.1 查看mysql当前时间,当前时区

> select curtime();   #或select now()也可以
+-----------+
| curtime() |
+-----------+
| 15:18:10  |
+-----------+
 
> 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时区

1.2 修改时区

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

 

解决方法:

方法1、使用6.0以下版本的jdbc:降版本,并不推荐;

方法2、在jdbc url指定默认时区:

还有一种是在jdbc连接的url后面加上serverTimezone=UTC或GMT即可,如果指定使用gmt+8时区,需要写成GMT%2B8,否则可能报解析为空的错误。示例如下:

jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&characterEncoding=utf-8 
jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&characterEncoding=utf-8  
jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 

增加: 

serverTimezone=UTC 
serverTimezone=GMT%2B8

推荐使用如下:

serverTimezone=Asia/Shanghai

方法3、在数据库配置中添加默认时区:

SQL语句配置全局时区

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone |        |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set, 1 warning (0.00 sec)
 
#设置当前session时区,即时生效,但仅作用于当前session
mysql> set time_zone='+8:00';
Query OK, 0 rows affected (0.00 sec)
 
#设置全局时区,即时生效,作用于所有session
mysql> set global time_zone='+8:00';
Query OK, 0 rows affected (0.00 sec)
 
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone |        |
| time_zone        | +08:00 |
+------------------+--------+
2 rows in set, 1 warning (0.00 sec)

或者通过修改my.cnf配置文件来修改时区:

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

我遇到的问题是:在数据库中select now(); 返回的时间正常,但是jdbc查询出的时间比实际时间要早8小时:

解决办法是jdbc连接的url中配置的时区参数:&serverTimezone=GMT%2B8

posted @ 2019-11-19 15:08  zhaoyanhao  阅读(3200)  评论(0编辑  收藏  举报