背景:
今天线上环境突发意外情况,昨天还好好的页面,突然少了两个模块,经检查发现查询结果是正常结果,但是返回数据格式却与预想的不一致,返回结果
{
"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会被统计。