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

createh52周前 (12-20)技术教程14

浅谈 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

相关文章

前端面试题(1):undefined和null的区别

寒冬来临,裁员的消息此起彼伏。现在准备面试肯定是有备无患,我准备了一系列前端面试的常见问题,和大家一起学习。不管你是不是有找工作的需求,多掌握一些肯定是有益无害。1.undefined和null有什么...

在Java中如果对象的引用被设置为null,垃圾收集器应当如何工作?

在Java中,如果在程序初始化之初就将一个对象的引用设置为NULL。那么JVM的垃圾回收机制该如何工作呢?是不是就会立即释放该对象所占用的内存呢?答案是否定的,将一个对象设置为NULL,垃圾回收机制并...

Java判空,Optional和工具类真香?还是if(obj == null)更靠谱?

背景描述最近在开发项目时,我遇到了一个需要从 Hyperlink 对象中获取 link 属性的小需求。这个过程中我需要判断 Hyperlink 对象是否为 null,以防止出现空指针异常。面对这种情况...

java.lang.NullPointerException空指针异常

NPE空指针异常出现的原因是什么?空指针异常应该是初学编程的同学遇到最多的一种异常,由于缺少编程经验,对引用数据类型的数据使用不恰当导致的异常。空指针就是空引用,java空指针异常就是引用变量本身为n...

关于Java String 类型转换时null的问题

开发中经常遇到从集合类List、Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.NullPointerException,在此总结一下常用转换为St...

避免Java中NullPointerException的Java技巧和最佳实践

欢迎关注头条号:Java小野猫Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢。下面我们就从几个方面来入手,解决这个棘手的?问题...