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   疯狂的妞妞  阅读(643)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示