【解决过程】Mybatis执行select count(*)返回结果为0,但是数据库表中有数据问题排查过程

  • 目的:

记录一下开发过程中遇到的一个问题(Mybatis执行select count(*)返回结果为0,但是数据库表中有数据),以及解决过程;

  • 问题阐述:

Oracle数据库下,通过MyBatis执行下面这行sql:

select 
    count(*) 
from 
    tm_user 
where 
    empid = #{empID}

service里接收到的结果总是0,通过调试把sql加入参数放到navicat里执行返回的count是1,至此问题很明确了。
解决过程

  1. parameterType="java.lang.String"没问题;
  2. resultType="java.lang.Integer"没问题;
  3. 观察log,参数占位符位置没问题,带入的参数也是传入的参数,没问题。执行结果Total为1,说明sql执行正常;(明确一下这里的Total不是count的数量,只是结果集行数,即使count为8,Total也是1);
  4. 是不是连错数据库了,应该连开发库错连到测试库了?检查数据库连接,没问题,是开发库;
  5. 好怪~
  6. 去掉参数, 换一个参数,再换回刚才的参数
  7. 怀疑是传入的参数里有空格?trim()一下,执行,还是有问题~
  8. 看数据库empid字段,CHAR类型长度32,原因找到了,

CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim()。
解决:
也就是说,并不是传入的参数里有空格,而是数据库存的这个empid有问题,因为字段定长32,而这个奇葩的empid是‘EMDM1846’,长度只有8,但实际存储的是EMDM1846还跟着24个空格,所以本身sql是没有问题,但查询结果就是0,因为参数没有符合的记录对应啊,即便你觉得对应,但oracle不那样认为。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小技工丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值