四海内皆兄弟

NULL是不是空?

一般开发人员喜欢用NULL来作为判断,但是这不是一个好习惯。在有些数据库比如Oracle中几乎是无法用到索引的,在其他数据库中也极有可能无法用到索引。这里严谨一点,因为我都有在特殊场景的案例以及原因。

今天先说NULL是什么?开发人员认为这不就是空吗?我说不是啊。

来看看下面的实验。这里写入一条空值,另外再写入一个空字符串。因为也有开发有这个习惯。一起看看效果。

Image

然后如下图查询a列不等于0的,看到这个结果开发人员是吃惊的。和预期大相径庭。

Image

同样,如下图,如果计算求和与平均值,都没id2和id3的参与。只有id1和id4。

Image

如果对全表进行运算,其结果如下图id2和id4都不参与运算

Image

模拟一条数据变为负数。如下图所示,会发现count的数值和预期的逻辑不符合。如果以这样的数据去做业务判断,显然就会出错。

Image

为什么会这样?就是我们一开始杀锁的,NULL不是空,而是不确定。因为不确定,所以各种查询都没有他,也不支持运算。

而where column is null极有可能是无法用到索引的。所以这就是我们不建议仅仅使用NULL作为业务逻辑判断的。

    以前有个段子,一个同事是做移动端开发向老张借手机做测试。老张借他以后就走了。

     这个同事测试一下午,就一个获取微信昵称的功能就是不行,总是获取不到。同事开始怀疑是安卓和ios的区别,但是经历各种方法都解决不了。怎么也找不到为什么?

     最后等老张回来,同事垂头丧气说一个功能搞了一下午解决不了。老张问什么情况?同事说就是获取昵称获取不到。你的昵称叫什么?老张说我的昵称是null。

Image