zoukankan      html  css  js  c++  java
  • mysql时区问题解决几种方法

    问题排查:

    mysql数据库可以通过下面两个sql查看时区:
     

    select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')); 

    或者:

    SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 

    如果是中国标准时间, 会输出08:00

    以下记录修改mysql时区的几种方法。

    具体:
    方法一:通过mysql命令行模式下动态修改
    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;  #立即生效

    解决方法0-使用6.0以下版本的jdbc:

    降版本,并不推荐;

    解决方法1-在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

    解决方法2-在数据库配置中添加默认时区:

    方法1(该方法本人未实验成功):在my.cnf(linux)或者my.ini(win)配置文件[mysqld]底下添加: default-time-zone = '+8:00' 然后重启数据库服务器即可。

    方法2: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使新时区生效

     
    方法三:如果不方便重启mysql,又想临时解决时区问题,可以通过php或其他语言在初始化mysql时初始化mysql时区
    这里,以php为例,在mysql_connect()下使用mysql_query(“SET time_zone = ‘+8:00′”)。
    这样可以在保证你不重启的情况下改变时区。但是mysql的某些系统函数还是不能用如:now()。这句,还是不能理解。

    正因为当初对未来做了太多的憧憬,所以对现在的自己尤其失望。生命中曾经有过的所有灿烂,终究都需要用寂寞来偿还。
  • 相关阅读:
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31
    知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  • 原文地址:https://www.cnblogs.com/candlia/p/11919967.html
Copyright © 2011-2022 走看看