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);