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()。这句,还是不能理解。

    正因为当初对未来做了太多的憧憬,所以对现在的自己尤其失望。生命中曾经有过的所有灿烂,终究都需要用寂寞来偿还。
  • 相关阅读:
    tomcat 无法clean 的bug
    Open Type vs Open resource
    Cannot change version of project facet Dynamic Web Module to 2.4.
    股权稀释
    Java的各种打包方式
    记忆
    【转】给女儿的信
    买房费用
    工作职场
    装修-水电改造
  • 原文地址:https://www.cnblogs.com/candlia/p/11919967.html
Copyright © 2011-2022 走看看