Mysql -- 数据库查询有结果,但是程序查询结果集为空

以 MybatisPlus + Mysql 8.0 为例:

  1. 代码接受实体类字段对应全部错误
    其实这种情况严格意义上不能说是查询结果不一致,比如我们将查询出的结果集用一个 **List ** 接受,我们可能会发现这个列表的 size 是大于 0 的,但是列表中不存在任何元素,那就要考虑是否字段对应关系出现了问题,Mybatis默认使用驼峰式匹配。

  2. 查看程序中的Mysql链接字符串是否添加了编码格式
    jdbc:mysql:// ${DBURL:localhost}:
    ${DBPORT:3306}/aaa?useUnicode=true&rewriteBatchedStatements=true&characterEncoding=utf8&serverTimezone=GMT%2B8

  3. 查看数据库的编码
    show VARIABLES like 'char%'
    在这里插入图片描述
    一般情况下都是 utf8(utf8mb3) 或者 utf8mb4
    如果不是找到mysql安装路径,修改配置文件并重启服务
    在这里插入图片描述

  4. 查看 general log ,确认本地执行的语句和程序中执行的语句是否一致,并确认数据库中的数据正确性
    general logbinlog 要轻量,开启 general log 的方法可以自行搜索,我们开启之后执行程序查询并找到我们执行的语句
    我在执行后打印的日志中,有一行 SET NAMES utf8 ;
    在这里插入图片描述
    ~
    然后我把这一句在本地执行时也加上了
    例如之前 select * from a where name =‘测试’ ; 是有记录的
    但是执行 set names utf8 ; select * from a where name =‘测试’ ; 查询结果就是空的
    ~
    显然就是这个编码设置导致查询结果异常,说明数据库中的数据不是用 utf8 格式存储的,一般查询条件中存在中文时会出现查询结果对不上的情况
    因为字母和阿拉伯数字不管是在 latin 还是 utf8 以及 gbk 编码中都是一样的
    ~
    再确认一下上面的推断,我们根据其他字段选择测试这行数据,并打印 “测试” 的编码值:
    执行 select HEX(name) from a where id ='测试的ID’
    正常数据
    在这里插入图片描述
    异常数据
    在这里插入图片描述
    一个中文在 mysql 中以 utf8 存储时占用三个字节,因此我们可以看到第一张图的结果是字节长度是正常的。
    说明推断是正确的,继而找数据编码错误的原因

  5. 确认自己使用的SQL管理工具没有特殊设置
    在按照上面第三条修改了数据库配置之后,可能发现show VARIABLES like ‘char%’,仍然和原来一样
    或者正如第四条中一样,数据不是 utf8 格式的
    那么就有可能是SQL管理工具在搞鬼,我是用的是 Navicat ,数据是通过 数据传输 功能从其他数据库中同步过来的。
    ~
    其中数据库连接中有个配置,如下
    这个地方一般不要修改,选择自动就行,就是这里不知道什么时候设置了不正确的编码导致数据同步的数据保存的格式有问题。
    在这里插入图片描述

  6. 确认查询的结果集确实是有内容的
    有一些情况下,我们会用到关联查询,比如:
    select b. * from a left join b on a.id =b.id where a.id=1
    但是实际情况是,我们能够在 a 表中查询到相关行,但是在b表中没有该行对应的信息,也就表示我们查询的b.*中的字段全是null值。
    在程序 中可能就会体现为查询到了记录,但是记录中的值都是空的。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mingvvv

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

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

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

打赏作者

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

抵扣说明:

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

余额充值