首页 > 数据库 >MyBaits查询MySQL日期类型结果相差8个小时

MyBaits查询MySQL日期类型结果相差8个小时

时间:2023-07-09 14:34:26浏览次数:45  
标签:serverTimezone MySQL MyBaits 查询 canonicalTimezone mysql 08

问题描述

在Java项目中使用MyBatis作为ORM框架,但是查询出的MySQL日期类型字段值总是比数据库表里的值多8个小时。
具体说明:
MySQL数据库表字段类型为timestamp,映射的Java日期类型为java.util.Date,当数据库表里的字段值为2023-07-08 00:08:38时,查询出的Java字段值为2023-07-08 08:08:38。显然,查询结果的时间比表里实际存储的时间值大了8个小时。

原因分析

一开始以为是映射的Java日期类型不正确,修改为java.sql.Date依然不解决问题。
后来经过查询得知,造成查询结果与表值不一致的原因是:JDBC连接URL中设置的serverTimezone参数不正确导致。
错误的设置:jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
正确的设置:jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai

那么,在这里首先先解决的问题就是JDBC连接参数serverTimezone的作用是什么。
答案:serverTimezone参数用于设置对日期字段进行处理的时区,如果设定serverTimezone=UTC,会比中国时间早8个小时,如果在中国,可以选择Asia/Shanghai或者Asia/Hongkong

追溯JDBC源码可以发现,在com.mysql.cj.mysqla.MysqlaSession类中有一个方法configureTimezone,专门用于处理时区的值。

// mysql-connector-java-6.0.6 源码解读
// 对应Maven依赖配置:
// <dependency>
//    <groupId>mysql</groupId>
//    <artifactId>mysql-connector-java</artifactId>
//    <version>6.0.6</version>
// </dependency>
public void configureTimezone() {
    // 从MySQL服务端读取时区变量配置,在MySQL上可以执行`show variables like '%time_zone%'`查询
    String configuredTimeZoneOnServer = getServerVariable("time_zone");

    if ("SYSTEM".equalsIgnoreCase(configuredTimeZoneOnServer)) {
        configuredTimeZoneOnServer = getServerVariable("system_time_zone");
    }
    // 从JDBC连接参数`serverTimezone`中读取时区配置
    String canonicalTimezone = getPropertySet().getStringReadableProperty(PropertyDefinitions.PNAME_serverTimezone).getValue();

    if (configuredTimeZoneOnServer != null) {
        // user can override this with driver properties, so don't detect if that's the case
        if (canonicalTimezone == null || StringUtils.isEmptyOrWhitespaceOnly(canonicalTimezone)) {
            try {
                canonicalTimezone = TimeUtil.getCanonicalTimezone(configuredTimeZoneOnServer, getExceptionInterceptor());
            } catch (IllegalArgumentException iae) {
                throw ExceptionFactory.createException(WrongArgumentException.class, iae.getMessage(), getExceptionInterceptor());
            }
        }
    }

    if (canonicalTimezone != null && canonicalTimezone.length() > 0) {
        // 如果JDBC连接参数serverTimezone明确配置了值,则使用该参数值作为时区设置
        this.serverTimezoneTZ = TimeZone.getTimeZone(canonicalTimezone);

        //
        // The Calendar class has the behavior of mapping unknown timezones to 'GMT' instead of throwing an exception, so we must check for this...
        //
        if (!canonicalTimezone.equalsIgnoreCase("GMT") && this.serverTimezoneTZ.getID().equals("GMT")) {
            throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("Connection.9", new Object[] { canonicalTimezone }),
                    getExceptionInterceptor());
        }
    }

    this.defaultTimeZone = this.serverTimezoneTZ;
}

【参考】
关于mysql的时区(下):如何设置mysql的时区
Mybatis查询Mysql datetime类型时,相差8小时 解决方案
MyBatis 处理 MySQL 时间类型 date 、datetime、timestamp

标签:serverTimezone,MySQL,MyBaits,查询,canonicalTimezone,mysql,08
From: https://www.cnblogs.com/nuccch/p/17538699.html

相关文章

  • MySQL--Sorted Index Builds 导致备份失败故障分析
    问题概述xtrabackup备份失败,日志中有这样的信息InnoDB:Anoptimized(withoutredologging)DDLoperationhasbeenperformed.Allmodifiedpagesmaynothavebeenflushedtothediskyet.问题原因redologs会跳过一些DDL,PerconaXtraBackup监测到redolog有跳过时,它会......
  • Windows下MySQL 5.7.20的installer 模式安装
    一、安装Windows环境wrar_5.50.0.0_scp.exevcredist2013_x86.exeVC2015_x64.exeNDP452-KB2901907-x86-x64-AllOS-ENU.exeMicrosoft.NET4.0.zip二、installer模式安装MySQL         安装完成以后停止服务、改目录重新准备my.ini参数重新初......
  • 查询搜索历史
    /***查询搜索历史**@return*/@OverridepublicResponseResultfindUserSearch(){//获取当前用户ApUseruser=AppThreadLocalUtil.getUser();if(user==null){returnResponseResult.error......
  • MySQL8.0 密码管理与密码策略
    一、密码管理#新密码不能和前面三次的密码相同password_history=3;#新密码不能和前面九十天内使用的密码相同password_reuse_interval=90;#默认为off;为on时修改密码需要用户提供当前密码(开启后修改密码需要验证旧密码,root用户不需要)password_require_current......
  • 数据查询慢问题以及实现缓存预热
    数据查询慢问题解决办法:使用缓存技术,提前把数据从数据库中取出来,就可以更快的进行读写。1.缓存的实现Redis(分布式缓存)memcached(分布式)Etcd(云原生架构的一个分布式存储,存储配置,扩容能力)ehcache(单机)本地缓存(Java内存Map)Caffeine(Java内存缓存,高性能)GoogleGuavaR......
  • 字节、腾讯争先部署,ClickHouse+Doris 赶超 MySQL 810 倍
    阿里流传着这样一句话,“一切业务数据化,一切数据业务化”。 作为大数据从业者,你一定明白有数据是一回事,可要想让数据发挥价值、成为生产力是另一回事。手里得有两把刷子,才能成为大数据圈儿的“大拿”! 如何实现智能路径检测,查询出符合条件的路径详情及符合路径的用户数?关于......
  • Debian 11 x64 安装 MySQL 8.0.33
    更新sudoaptupdatesudoaptinstallgnupg安装DEBPackagewget-chttps://dev.mysql.com/get/mysql-apt-config_0.8.25-1_all.debsudodpkg-imysql-apt-config_0.8.25-1_all.deb具体版本见官方网站:MySQLCommunityDownloads,这里仅以版本0.8.25-1作为示例。更新......
  • 字节、腾讯争先部署,ClickHouse+Doris 赶超 MySQL 810 倍
    阿里流传着这样一句话,“一切业务数据化,一切数据业务化”。作为大数据从业者,你一定明白有数据是一回事,可要想让数据发挥价值、成为生产力是另一回事。手里得有两把刷子,才能成为大数据圈儿的“大拿”!如何实现智能路径检测,查询出符合条件的路径详情及符合路径的用户数?关于有序漏斗转化......
  • 吹爆!阿里大牛MySQL优化笔记有多强?才在GitHub被BATJ联手封杀
    今年的春招很猛,公司的大神也变多了。。。来了个新同事,一看是个二本生,还是非科班出身,刚30岁。。。结果没想到人家上来就把现有项目的性能优化了一遍,直接给公司节省了一半的成本,这种“王炸”打法,直接给所有人整懵了。 一问情况,才知道这位仁兄也是一路被虐过来的。去年年底被裁......
  • 电子商务网站-(MySQL)数据库设计
    1.确定功能和需求-用户可以浏览产品列表,并查看每个产品的详细信息。-用户可以将产品添加到购物车,并在购物车中修改产品数量或删除产品。-用户可以生成订单,并提供送货地址和付款信息。-管理员可以管理产品信息、订单和用户。2.设计数据库架构Products(产品表)prod......