mybatis查询mysql结果的null和N/A引起的异常问题排查

背景:

        今天线上环境突发意外情况,昨天还好好的页面,突然少了两个模块,经检查发现查询结果是正常结果,但是返回数据格式却与预想的不一致,返回结果

{
    "success": true,
    "code": 200,
    "msg": null,
    "data": [
        null
    ]
}

预想中的查询结果为空时,data字段应该是一个空的数据,但是返回结果中却出现了一个空对象,数据连接层使用mybatis框架,所以怀疑mybatis做了一些转换,就转换了一下sql查询方式发现同样的sql查询不同的字段值时返回的格式会有区别,在navicat中执行sql发现查询结果还是有区别的。

返回null对象的sql为:

 SELECT SUM(media.read_count) as `count`,media.*,temp.*,channel.*
        FROM tableName media
        ORDER BY `count` desc

在Navicat执行结果为:

SELECT * FROM tableName media temp.maxDay=media.`day` ;

查询结果为:

仔细看一下会发现,查询结果仍是有区别的

  • NULL是指某个字段没有值
  • N/A是指结果集为空,是没有数据输出的。

所以当查询结果为NULL时,经过mybatis转换后便是一个null对象,返回N/A时,表示没有结果,返回的结果就是一个空的数组。

仔细观察两个sql会发现,使用聚合函数sum时返回结果就是null,查询结果为单独列时,就会返回N/A。

延伸拓展:

N/A是指结果集为空,是没有数据输出的;

NULL是指某个字段没有值;

空值一般指空字符串。

null和空值的区别:

相同点:

        null和空值都代表有数据输出。

不同点:

1、内存区别
        空值(‘’)的长度是0,是不占用空间的;
        而的NULL长度是NULL,其实它是占用空间的。

2、查询的区别
        查询null:使用函数isnull,注意isnull有不同形式
        查询空值:则使用=’ ',两个引号中间是没有空格的

3、统计的区别
        count(字段),若该字段在某一行的值为NULL,则该行不会被统计;
        若该字段在某一行的值为空值,该行会被统计
        count( * ):NULL会被统计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值