db2中null和空值的区别_MySQL数据库的表中 NULL 和 空值 到底有什么区别呢?

本文作者极客小俊探讨了在DB2和MySQL中NULL与空值的区别,包括它们在占用空间、插入方式、查询方式以及count()函数统计时的不同。建议使用`IS NULL`或`IS NOT NULL`查询NULL值,而空值可使用算术运算符。文章强调在实际开发中选择NULL值或空值应根据具体需求。
摘要由CSDN通过智能技术生成

da9801c30f6cfeca9a1d6fd6ec2fa854.png

作者:极客小俊 一个专注于web技术的80后

我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人!

知乎@极客小俊,官方首发原创文章


浅谈 NULL 和 空值的区别

NULL也就是在字段中存储NULL值
空字符串值也就是字段中存储空字符('')

我们来通过测试来看看 他们彼此的区别:

1、占用空间区别

 mysql> select length(NULL), length(''), length('1');
 +--------------+------------+-------------+
 | length(NULL) | length('') | length('1') |
 +--------------+------------+-------------+
 |         NULL |          0 |           1 |
 +--------------+------------+-------------+
 1 row in set (0.03 sec)
 ​

小结 : 从上面的测试可以看出 字符串空值('')的长度是0,是不占用空间的, 而的NULL长度是NULL,其实它是占用空间的!

NULL columns require additional space in the row to record whether their values are NULL.
意思是: NULL列需要行中的额外空间来记录它们的值是否为NULL

通俗意义上讲: ('')字符串空值就像是一个真空转态杯子,什么都没有,而NULL值就是一个装满空气的杯子,虽然看起来都是一样的,但是有着本质的区别

2、插入方式区别

 #创建一个表,tb_test
 ​
 create table tb_test(
   id int unsigned primary key auto_increment,
   one varchar(10) NOT NULL,
   two varchar(255) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 ​
 ​
 插入进行验证:
 ​
 #全部插入 NULL,会失败  原因就是指定的不允许插入NULL
 insert into tb_test(one,two) value (NULL,NULL);
 1048 - Column 'one' cannot be null
 ​
 #全部插入 空字符串值,成功  原因就是 ('') 字符 和 NULL的类型都不一样 指定的是不允许插入NULL,又没有说不允许('')空字符串!^.^
 insert into tb_test(one,two) value ('','');
 Query OK, 1 row affected
 #这也是刚刚讲过not null约束测试insert语句的时候, 插入('')空字符串会成功的原因! 
 ​

3、在查询方式上的区别对比

 #创建一个表,tb_test2
 ​
 create table tb_test2(
   id int unsigned primary key auto_increment,
   one varchar(10) NOT NULL,
   two varchar(255) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 ​
 #模拟数据:
 insert into tb_test2(one,two) values (1,NULL);
 insert into tb_test2(one,two) values ('',2);
 insert into tb_test2(one,two) values (3,3);
 ​
 #查询one字段
 #使用 is null 来查询one字段
 select * FROM tb_test2 where one is null; #结果就是一条也没有,因为one字段并没有代表为NULL的数据存在!
 ​
 #使用 is not null 来查询one字段
 select * FROM tb_test2 where one is not null;  #结果被全部查询出来,因为one字段中的三个数据都不为NULL这个类型
 ​
 #使用 = 和 != 来查询one字段
 select * FROM tb_test2 where one ='';
 select * FROM tb_test2 where one != '';
 ​
 #查询two字段
 #使用 is null 来查询two字段
 select * FROM tb_test2 where two is null;  #结果有一条符合NULL,
 ​
 #使用 is not null 来查询two字段
 select * FROM tb_test2 where two is not null; #结果是不符合NULL的有两条
 ​
 ​
 #使用 = 来查询two字段
 select * FROM tb_test2 where two ='';
 ​
 #使用 != 来查询two字段
 #这里要注意的是为NULL的并没有查询出来,原因用 != 来查 字符串空('')的时候, 会把NULL也当做是字符串空来判断吧! 
 select * FROM tb_test2 where two != ''; 
 ​
 ​

小结: 如果要单纯查NULL值列,则使用 is NULL去查,单纯去查空值('')列,则使用 =''

建议查询方式:NULL值查询使用is null/is not null查询,而空值('')可以使用=或者!=、<、>等算术运算符来查!


4、在count()统计函数上的区别

 #创建一个表,tb_test3
 ​
 create table tb_test3(
   id int unsigned primary key auto_increment,
   one varchar(10) NOT NULL,
   two varchar(255) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 ​
 #模拟数据:
 insert into tb_test3(one,two) values (1,NULL);
 insert into tb_test3(one,two) values ('',2);
 insert into tb_test3(one,two) values (3,3);
 ​
 #使用COUNT函数统计one字段:
 select count(one) from tb_test3;   #结果为: 3 条, 说明 空字符串('') 会被count()函数统计!
 #使用COUNT函数统计two字段:
 select count(two) from tb_test3;   #结果为: 2条,  原因是NULL 不会被count()函数统计到!
 ​
 #注意: 使用 * 号来统计会把NULL算进去!
 SELECT count(*) FROM tb_test;
 +----------+
 | count(*) |
 +----------+
 |        3 |
 +----------+
 ​

实际开发到底是使用NULL值还是空值('')呢?

根据实际业务来进行区分, 个人建议在实际开发中如果没有特殊的业务场景,可以直接使用空字符串值('') !

03667eac4977341a0b6e4ac3e8eb3c8e.gif

005d4504c530c7e77e8b495be575c0e4.png

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦! 听说 点赞 的人运气不会太差,每一天都会元气满满哦 嘿嘿!!! ❤️ ❤️ ❤️ 大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

更多精彩内容请前往 GeekerJun 或 个人博客、

也可以百度关键字: 极客小俊 获取更多知识干货!

如果以上内容有任何错误或者不准确的地方,欢迎在下面 留个言指出、或者你有更好的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值