zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    从传统BI报表系统上重构指标库
    autoload魔术方法的妙用
    kerberos委派详解
    一篇文章弄懂session的两种存储方式
    一款专门针对高质量女性的易语言钓鱼样本简单分析
    长城杯线上赛wp
    羊城杯WP
    ICMP隧道通信原理与通信特征
    浅析栈溢出遇到的坑及绕过技巧
    从本地到WordPress代码注入
  • 原文地址:https://www.cnblogs.com/zhaoyanhaoBlog/p/11889627.html
Copyright © 2011-2022 走看看