登录
首页 >  数据库 >  MySQL

数据库时区那些事儿 - MySQL的时区处理

来源:SegmentFault

时间:2023-02-23 19:58:59 430浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《数据库时区那些事儿 - MySQL的时区处理》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下MySQL、时区、jdbc,希望所有认真读完的童鞋们,都有实质性的提高。

原文地址

当JVM时区和数据库时区不一致的时候,会发生什么?这个问题也许你从来没有注意过,但是当把Java程序容器化的时候,问题就浮现出来了,因为目前几乎所有的Docker Image的时区都是UTC。本文探究了MySQL及其JDBC驱动对于时区的处理方式,并尝试给出最佳实践。

先给总结

  • docker run --name mysql-timezone-test \
      -e MYSQL_RANDOM_ROOT_PASSWORD=yes \
      -e MYSQL_DATABASE=testdb \
      -e MYSQL_USER=tz \
      -e MYSQL_PASSWORD=tz \
      -p 3306:3306 \
      -d mysql:8

    下面是结果:

    Insert data, Time Zone        : 中国标准时间
    java.util.Date                : 2018-09-14 10:00:00
    Insert into timestamp column  : 2018-09-14 10:00:00
    --------------------
    Retrieve data, Time Zone      : 中国标准时间
    Retrieve java.util.Date       : 2018-09-14 10:00:00
    Retrieve formatted string     : 2018-09-14 02:00:00
    --------------------
    Retrieve data, Time Zone      : 中欧时间
    Retrieve java.util.Date       : 2018-09-14 04:00:00
    Retrieve formatted string     : 2018-09-14 02:00:00

    可以看到

    JVM Time Zone              : 中国标准时间
    Test CURRENT_DATE()        : 2018-09-18
    Test CURRENT_TIME()        : 10:55:41
    Test CURRENT_TIMESTAMP()   : 2018-09-18 10:55:41.0
    --------------------
    JVM Time Zone              : 中欧时间
    Test CURRENT_DATE()        : 2018-09-18
    Test CURRENT_TIME()        : 03:56:02
    Test CURRENT_TIMESTAMP()   : 2018-09-18 04:56:02.0

    可以看到结果是基本符合文档里的说明的,但是要注意,在

    -- 查询系统时区和session时区
    SELECT @@global.time_zone, @@session.time_zone;
    
    -- 设置session时区
    SET time_zone = 'Asia/Shanghai';

    详见:MySQL Server Time Zone Support

    Docker启动时设定时区

    你可以在docker启动的时候设定MySQL容器的时区,比如这样

    -e TZ=Asia/Shanghai

    这个方法有问题,会出现时间错乱,workaround是root用户连接到MySQL,然后执行

    SET GLOBAL time_zone = 'Asia/Shanghai';

    这样客户端连接MySQL时,查询的时间的时区都是

    Asia/Shanghai
    了。

    参考资料

    相关代码

    https://github.com/chanjarste...

    今天带大家了解了MySQL、时区、jdbc的相关知识,希望对你有所帮助;关于数据库的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表