mysql驱动版本变更导致查询数据结果一直是空

1 引言

最近接手了一个已离职同事的java项目,这个项目中原来使用了自己的mysql驱动版本,并未使用公司公共依赖中的版本号。我想为了统一版本号,就将当前项目中pom文件中mysql的版本号verson给去除了。没怎么自测,就直接发到测试环境了,结果没多久就有测试人员告诉了说,有接口报错。
其主逻辑sql如下

SELECT * FROM rule_category where `name`='企业资质' and parent_id=0;

后面发现不止这个接口查询结果为空,其他好几个接口的查询结果都未空。我用同样的sql语句在navicat中能查出结果,我开始怀疑我是不是连错数据库了,是不是连接到开发环境中的数据库。我使用Environment#getProperty("spring.datasource.url")获取到的数据库url可以确定是测试环境。后面进一步发现这些接口中都有中文查询条件,我开始怀疑是字符集的问题。回到刚才的数据库连接URL,其格式是jdbc:mysql://xxhost:3306/rule_engine?serverTimezone=GMT%2B8 ,这个URL明显没有指定字符集编码,我在这个url上加上characterEncoding=UTF8参数,本地重新启动项目,在swagger中调用接口,最终预期数据正常返回。
现在问题是解决了,大致应该是不同版本的数据库驱动其默认字符集编码不同。这个项目的原始数据库驱动版本是8.0.32 ,而我修改后继承了父依赖的版本号8.0.21

先看mysql-connector 8.0.32

com.mysql.cj.NativeCharsetSettings#NativeCharsetSettings 是mysql驱动 8.0.32 中的一个字符集配置相关的类,
在这里插入图片描述
上面的characterEncoding字段的description的大致意思是在未主动配字符集编码时,8.0.25及以下版本的数据库驱动会使用mysql服务器的默认编码,而在8.0.26及以上版本的数据库驱动会使用utf8mb4

8.0.23的mysql驱动在建立socket连接之前,会调用com.mysql.cj.NativeCharsetSettings#configurePreHandshake方法
在这里插入图片描述
sessionCollationIndex为null,先给它赋值为utf8mb4_0900_ai_ci字符集对应的index,在然后根据数据库服务器版本号重新进一步赋值,我们公司数据库的版本5.7.39,此版本号小于下图中的8.0.1会被赋值为 utf8mb4_general_ci对应的index。所以可以看出8.0.23版本的mysql驱动的默认字符集编码是utfmb8
在这里插入图片描述

再看下面的connectionCollation的说明,这个属性是字符排序规则,这里还提到了字符编码。如果connectionCollation是latin1_swedish_ci,那么mysql的字符集就是latin1 ,而映射到java语言就是windows-1252字符集,如果characterEncoding没有被设置,那么就会使用windows-1252字符集。这里最后几句话再次说明了:characterEncoding没有被主动设置时,在8.0.25以下版本,使用数据库server端的默认字符编码,而在8.0.26及以上版本,直接使用utf8mb4编码。
在这里插入图片描述

再看mysql-connector 8.0.21

类似地此版本的驱动在建立正式的socket连接之前,会调用com.mysql.cj.NativeCharsetSettings#configurePreHandshake方法
在这里插入图片描述
configurePreHandshake又会调用 readServerCapabilities方法,readServerCapabilities方法就是解析mysql server返回的第一数据报文,这个数据报文中包含了mysql server的通信协议版本、数据库版、默认字符集等信息。readServerCapabilities方法
的核心的逻辑在serverCapabilities.setInitialHandshakePacket(buf)这行代码
在这里插入图片描述
在这里插入图片描述
从下图可以看出 mysql server的默认字符集编码是latin1,对应的java字符集是windows-1252
在这里插入图片描述
为了验证mysql server的默认字符集是否是latin1, 可以在navicat执行一个这个SQL脚本

show VARIABLES like '%set_database';

下图显示其字符集编码果然是latin1
在这里插入图片描述
而数据库的表字段rule_category.name是utf8mb4,在8.0.21版本的驱动使用mysql server默认的latin1编码去查询utf8mb4编码的 name字段,当然会导致条件不匹配,查询结果为空
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费的八字软件

无敌八字排盘软件完全免费使用,即使用不需要付费且无任何限制。同时推出手机版电脑版,两版本数据互通互用,即电脑版的数据可以备份到手机版上导入,手机版的数据也可以备份到电脑版上恢复导入,方便手机和电脑共用的朋友…

Golang实现递归复制文件夹

代码 package zdpgo_fileimport ("errors""os""path/filepath""strings" )// CopyDir 复制文件夹 // param srcPath 源文件夹 // param desPath 目标文件夹 // return error 错误信息 func CopyDir(srcPath, desPath string) error {…

Android-自定义三角形评分控件

效果图 序言 在移动应用开发中,显示数据的方式多种多样,直观的图形展示常常能带给用户更好的体验。本文将介绍如何使用Flutter创建一个自定义三角形纬度评分控件,该控件可以通过动画展示评分的变化,让应用界面更加生动。 实现思…

转行3年涨薪300%,我总结了一套产品经理快速入门指南!

想转行的产品小白,初期一定会遇到这个问题——我要如何 0 基础转行产品经理? 要想 0 基础快速转行产品经理,我通过个人实践总结了 5 个关键点,可以参考。 一、熟悉产品经理的工作全流程 转行的产品小白,首先要建立产…

ABtest假设检验知识|配对检验|比率检验|单向表-列联表检验

文章目录 1 假设检验基础2 一般假设检验2.1 假设检验包2.2 sample - 点击转化率2.2.1 问题描述2.2.2 实验设计2.2.3 数据处理2.2.4 方差齐性检验2.2.5 假设检验2.2.6 结果分析 3 检验两个均值的差:配对3.1 大样本检验3.1.1 单侧检验3.1.2 双侧检验 3.2 小样本检验3.…

【大模型】(记一面试题)使用Streamlit和Ollama构建PDF文件处理与聊天机器人应用

【大模型】(记一面试题)使用Streamlit和Ollama构建PDF文件处理与聊天机器人应用 我在找工作的过程中,遇到一个面试题:搭建一个简易的利用大型 LLM 和 RAG 来实现用户与PDF文件的自然语言交互。 参考链接:https://medium.com/the-ai-forum/ra…

算法题1:电路开关(HW)

题目描述 实验室对一个设备进行通断测试,实验员可以操控开关进行通断,有两种情况: ps,图没记下来,凭印象画了类似的 初始时,3个开关的状态均为断开;现给定实验员操控记录的数组 records ,records[i] = [time, switchId],表示在时刻 time 更改了开关 switchId 的状态…

【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型

【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型 前言 实际上关于开源or闭源,一直以来都是颇有争议的话题,人们争执于数据的隐私性和共享性,到底哪一方能获得的收益更大。而对于开源与闭源哪个更好实际上也就是说是…

深度学习500问——Chapter09:图像分割(5)

文章目录 9.12 DenseNet 9.13 图像分割的数据集 9.13.1 PASCAL VOC 9.13.2 MS COCO 9.13.3 Cityscapes 9.14 全景分割 9.12 DenseNet 这篇论文是CVPR2017年的最佳论文。 卷积神经网络结构的设计主要朝着两个方向发展,一个是更宽的网络(代表&#xff1a…

【算法例题】n元钱买n只鸡

题目描述&#xff1a;公鸡5元1只&#xff0c;母鸡3元1只&#xff0c;小鸡1元3只&#xff0c;问&#xff1a;n元钱买n只鸡&#xff0c;怎么买&#xff1f; 解题思路&#xff1a;这题要用枚举算法&#xff0c;枚举鸡的数量&#xff0c;代码如下&#xff1a; ​#include <bit…

初步学习pygame,使用pygame搭建简单的窗口效果

在VSCode上使用pygame 第一步&#xff1a;创建 Python 虚拟环境 打开 VSCode 中的 Terminal&#xff08;在菜单栏中选择 View > Terminal&#xff09;使用 cd 命令切换到你的项目文件夹输入以下命令来创建一个新的虚拟环境&#xff1a; python3 -m venv env这将在你的项目…

每天五分钟深度学习框架PyTorch:创建具有特殊值的tensor张量

本文重点 tensor张量是一个多维数组,本节课程我们将学习一些pytorch中已经封装好的方法,使用这些方法我们可以快速创建出具有特殊意义的tensor张量。 创建一个值为空的张量 import torch import numpy as np a=torch.empty(1) print(a) print(a.dim()) print(s.shape) 如图…

三菱机械手维修控制器故障

在工业自动化领域&#xff0c;三菱工业机器人凭借其高性能、高可靠性和易用性&#xff0c;受到了广泛应用。然而&#xff0c;随着时间的推移&#xff0c;可能会出现MITSUBISH工业机械臂控制器故障&#xff0c;需要进行三菱机械手维修。 一、MITSUBISH机械手控制器故障诊断 在进…

冷干机的日常维护

冷干机的日常维护保养。 观察记录 (一)每班观察记录仪表值4次 1、压缩空气进出口压差不超过0.035Mpa; 2、蒸发压力表0.4Mpa-0.5Mpa; 高压压力表1.2Mpa-1.6Mpa。&#xff08;冷媒R22&#xff09; 3、压缩机的运行电流、电压。 (二)经常观察冷却水系统、压缩空气系统的进口温度…

【Numpy】深入解析numpy.mgrid()函数

numpy.mgrid()&#xff1a;多维网格生成与数值计算的利器 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393…

Qt下使用QImage和OpenCV实现图像的拼接与融合

文章目录 前言一、使用QImage进行水平拼接二、使用OpenCV进行水平拼接三、使用OpenCV进行图像融合四、示例完整代码总结 前言 本文主要讲述了在Qt下使用QImage和OpenCV实现图像的拼接与融合&#xff0c;并结合相应的示例进行讲解&#xff0c;以便大家学习&#xff0c;如有错误…

首发!飞凌嵌入式FETMX6ULL-S核心板已适配OpenHarmony 4.1

近日&#xff0c;飞凌嵌入式在FETMX6ULL-S核心板上率先适配了OpenHarmony 4.1&#xff0c;这也是业内的首个应用案例&#xff0c;嵌入式核心板与OpenHarmony操作系统的结合与应用&#xff0c;将进一步推动千行百业的数智化进程。 飞凌嵌入式FETMX6ULL-S核心板基于NXP i.MX 6ULL…

码蹄集部分题目(2024OJ赛16期;单调栈集训+差分集训)

&#x1f9c0;&#x1f9c0;&#x1f9c0;单调栈集训 &#x1f96a;单调栈 单调递增栈伪代码&#xff1a; stack<int> st; for(遍历数组) {while(栈不为空&&栈顶元素大于当前元素)//单调递减栈就是把后方判断条件变为小于等于即可{栈顶元素出栈;//同时进行其他…

【Linux】LAMP集群分布式安全方案

LAMP集群分布式安全方案主要涉及确保Linux、Apache、MySQL和PHP&#xff08;LAMP&#xff09;组合构成的集群环境的安全性和稳定性。 本次实验通过网络层安全对防火墙配置&#xff1a;使用防火墙&#xff08;如iptables或firewalld&#xff09;来限制对集群的访问&#xff0c;只…

[集群聊天服务器]----(五)User类、UserModel类

接着上文[集群聊天服务器]----(四)MySQL数据库模块&#xff0c;接下来我们对User类、UserModel类进行剖析&#xff0c;User表和UserModel类是项目最基本也是最重要的部分&#xff0c;通过它我们对用户的id&#xff0c;用户名&#xff0c;密码&#xff0c;状态相关信息进行存储&…