mysql - 空值对程序的影响

程序员往往整个职业生涯都在与空值问题作斗争。

简单唠唠,空值对程序上各个环节设计,所带来的的影响。

数据库的null

Conceptually, NULL means “a missing unknown value” and it is treated somewhat differently from other values。

从概念上讲,数据库上的 NULL 表示“缺失的未知值”,它的处理方式与其他值有所不同。

  • null 值不能使用 = , < , > 这样的运算符;
  • null 做算术运算的结果都是 null;
  • count 运算时不会包括 null 行等。

空值对计算的影响

在统计报表过程中,null 值相关的运算,是业务异常的重灾区:

  • 环比、同比:计算本月的数据净增长,因为一般不会缺失整个月的数据,编码往往会忽略这一问题,但是相对的,一旦发生这种情况,系统很容易雪崩,相关的计算全部出错。
  • 均值、求和:有 10 个用户,只有其中 5 个有绩效数据,联表查询时习惯用左关联,用全量的用户表关联数据表,这时候就会产生错误。

对于数字类型的字段,如果 null 值没特殊含义,尽可能以 0 作为缺省值。

空值对字符的影响

在应用程序上,empty 和 null 是两种不同状态,null 值是用户还没填,而 empty 是用户填了,但是填写了空字符串。

对于一个字符串,需要两次判断,才能确定数据的状态,劣质的代码往往只判断其中一种情况,这种问题,不仅仅出现在后台,在前端界面设计中,也很容易产生异常。

举个例子, 输入框默认值就是空串,如果程序未处理,就会将空串提交到后台,如果没有特殊编码,后台一般只拦截 null,但是不拦截空值。

如果 null 值没什么意义,可以考虑添加默认值,以减少程序的判断(实际上,为了程序自身的健壮性,即便给了默认值,仍然需要写两次判断)。

当然,也并不是什么都能给默认值,有些 null 值是有意义的,像是性别,除了男女,还有个未填写,这时候 null 就有意义。

class Test{
    public static void main(String[] args) {
        String a = "";
        if(a != null && !a.isEmpty()){
            System.out.println(a);
        }
    }
}

mysql上一个常见的错误

明明给字段设置了默认值,但是插入数据的时候,仍然报错:“Column cannot be null……”

这是因为误解了 mysql 默认值的作用:你不指定数值时,会使用默认值;如果指定值为 null,就会使用给定的值,而不再考虑默认值。

-- 测试表,a 字段有默认值
CREATE TABLE `test` (
`a` varchar(10) NOT NULL DEFAULT '',
`b` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 正确
INSERT INTO `test` (`a`, `b`) VALUES ('1', NULL);
-- 正确
INSERT INTO `test` (`b`) VALUES (NULL);
-- 错误,程序就以为你想设置 a 为 null,因此产生报错。
INSERT INTO `test` (`a`, `b`) VALUES (NULL, NULL);

posted on 2018-06-01 20:21  疯狂的妞妞  阅读(637)  评论(0编辑  收藏  举报

导航