百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

MySQL数据库的表中 NULL 和 空值 到底有什么区别呢

wptr33 2024-12-28 15:59 29 浏览

浅谈 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值还是空值('')呢?

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


作者:极客小俊GeekerJun
链接:https://juejin.im/post/6871709918139777037

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China&#39;s top diplomat to chair third China-Pacific Island countries foreign ministers&#39; meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...