- 目的:
记录一下开发过程中遇到的一个问题(Mybatis执行select count(*)返回结果为0,但是数据库表中有数据),以及解决过程;
- 问题阐述:
Oracle数据库下,通过MyBatis执行下面这行sql:
select
count(*)
from
tm_user
where
empid = #{empID}
service里接收到的结果总是0,通过调试把sql加入参数放到navicat里执行返回的count是1,至此问题很明确了。
解决过程
- parameterType="java.lang.String"没问题;
- resultType="java.lang.Integer"没问题;
- 观察log,参数占位符位置没问题,带入的参数也是传入的参数,没问题。执行结果Total为1,说明sql执行正常;(明确一下这里的Total不是count的数量,只是结果集行数,即使count为8,Total也是1);
- 是不是连错数据库了,应该连开发库错连到测试库了?检查数据库连接,没问题,是开发库;
- 好怪~
- 去掉参数, 换一个参数,再换回刚才的参数
- 怀疑是传入的参数里有空格?trim()一下,执行,还是有问题~
- 看数据库empid字段,CHAR类型长度32,原因找到了,
CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim()。
解决:
也就是说,并不是传入的参数里有空格,而是数据库存的这个empid有问题,因为字段定长32,而这个奇葩的empid是‘EMDM1846’,长度只有8,但实际存储的是EMDM1846还跟着24个空格,所以本身sql是没有问题,但查询结果就是0,因为参数没有符合的记录对应啊,即便你觉得对应,但oracle不那样认为。
-
解决:
要么把参数拼上缺少的空格,要么sql里where TRIM(empid) = #{empID}