前言
博主近日换工作后参与的一个项目遇到的问题,发现产品功能多个查询都没有数据,比对数据库执行SQL发现是存在对应记录的,那么问题来了,是什么原因导致从程序上查询不到数据,经过测试,携带中文参数的SQL查不到数据。
如果你的反应是乱码了,那么这个问题已经解决了一半。
正文
这个项目是java+mysql,那么实际环境楼主以mysql为例。
解决这个问题的思路无非就是考虑清楚,在server部分参数值是否编码格式与你的数据库编码格式一致。
为什么代码上发起的SQL查询无法查到数据,将SQL直接复制到SQL工具上执行能查到数据呢?
答:因为你的数据库管理工具已经针对你所要操作的数据库的编码格式做了统一,在执行一条SQL前会获取所操作数据库的编码格式,并将参数进行编码再执行查询。
为什么代码访问数据的连接上已经携带了指定编码还是查不到数据?
<property name="url" value="jdbc:mariadb://192.168.5.199:3306/orderManager?useUnicode=true&characterEncoding=utf-8&autoReconnect=true" />
答:这里设置的编码格式,是发起访问告诉数据库你的SQL内容是以什么格式编码和解码
======================================
举例:
A语句的参数编码格式为utf-8,而数据库B的编码格式为gbk,并且表内该字段B已经存有数据,这些数据必定是以数据库编码格式gbk编码,那么外部来了一个查询,要拿一个utf-8编码的数据比对B字段是否有一致,想想也知道,utf-8编码后,经过不对应的格式进行解码,得到的结果必定跟原数据表现形式不一致了,拿不一致的数据去与数据表字段比对,必定得不到想要的结果。
======================================
这条sql语句在代码上已经拼接完成,过程就是通过DAO发起数据库查询操作
select user_name,tellphone from t_user where user_name='张三'
我们知道自己代码上的参数编码格式,还要确认一下数据库的编码格式。
如果不做任何更改,mysql默认的编码格式应该是latin1,就像下面这样
show variables like 'character_set_%';
我们发现character_set_server 的值不是跟我们统一的编码格式一致,问题就是在这里。
执行对应操作代码:
set character_set_server=utf8;
之后重新连接,发现问题解决,至此,我的问题解决。