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