MySQL 中NULL和空值的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 中NULL和空值的区别相关的知识,希望对你有一定的参考价值。

"空值"是对null值的中文叫法,两者同指一个东西。

我想楼主是想弄清楚null(空值)与零长度字符串\'\'(或称为空字符串)之间的区别。

在代码里"零长度字符串"用一对没有间隔的英文引号\'\'表示,它的数据类型是明确的即属于字符型,存储"零长度字符串"是要占用物理磁盘空间的;
而null值其数据类型是未知的,它不会占用物理磁盘空间。
在不存在约束限制的情况我们可以将Null值插入任何数据类型的字段里,而零长度字符串\'\'只能插入到字符型数据类型字段中,插入其它类型字段会报错。

我们通过实测看看null(空值)与零长度字符串\'\'(或称为空字符长)之间的区别:
1)输出所有的记录
select * from students;

注意:此例输出源表中的全部记录,含null(空值)和零长度字符串\'\'.

2)输出电话为Null(空值)的记录
select * from students where phone is null;

注意:此例只输出含Null(空值)的记录

3)输出电话为零长度字符串的记录
select * from students where phone=\'\';

注意:此例只输出含零长度字符串的记录。

4)输出电话不是零长度字符串的记录
select * from students where phone<>\'\';

注意:此例mysql的处理方式有些特别,连含Null值得记录也排除掉了,这与MSSQL的处理方式有点不一致。

5)输出电话不为空的记录
select * from students where phone is not null;

注意:此例只要不含Null值的记录都予以输出
参考技术A 平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解。注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效率的事情的发生。
问题 1: 首先,我们需要搞清楚 "空值" 和"NULL"的概念:
1:空值('')是不占用空间的
2: MySQL中的NULL其实是占用空间的。官方文档说明:
“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”
长度验证:注意空值的''之间是没有空格的。
mysql> select length(''),length(null),length(' ');
+------------+--------------+--------------+
| length('') | length(null) | length(' ') |
+------------+--------------+--------------+
| 0 | NULL | 2 |
+------------+--------------+--------------+
问题2:
判断字段不为空的时候,查询语句到底是用 select * from tablename where columnname <> '' 还是用
select * from tablename where column is not null,2个查询语句有啥不同。
eg:

mysql> show create table testaa;
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| testaa | CREATE TABLE `testaa` (
`a` int(11) NOT NULL,
`b` varchar(20) DEFAULT NULL,
`c` varchar(20) NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
插入测试数据:
mysql> insert testaa values (1,'aa','');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa values (2,'','');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa values (3,null,'');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa values (4,NULL,'');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa values (5,'aafa','fa');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa values (6,'',NULL);
ERROR 1048 (23000): Column 'c' cannot be null
mysql> select * from testaa;
+---+------+----+
| a | b | c |
+---+------+----+
| 1 | aa | |
| 2 | | |
| 3 | NULL | |
| 4 | NULL | |
| 5 | aafa | fa |
+---+------+----+
查询验证过程:
mysql> select * from testaa where c is not null;
+---+------+----+
| a | b | c |
+---+------+----+
| 1 | aa | |
| 2 | | |
| 3 | NULL | |
| 4 | NULL | |
| 5 | aafa | fa |
+---+------+----+
5 rows in set (0.00 sec)
mysql> select * from testaa where c <> '';
+---+------+----+
| a | b | c |
+---+------+----+
| 5 | aafa | fa |
+---+------+----+
1 row in set (0.00 sec)
mysql> select * from testaa where c = '';
+---+------+---+
| a | b | c |
+---+------+---+
| 1 | aa | |
| 2 | | |
| 3 | NULL | |
| 4 | NULL | |
+---+------+---+
4 rows in set (0.00 sec)
mysql> select * from testaa where c is null;
Empty set (0.00 sec)
mysql> select * from testaa where b is not null;
+---+------+----+
| a | b | c |
+---+------+----+
| 1 | aa | |
| 2 | | |
| 5 | aafa | fa |
+---+------+----+
3 rows in set (0.00 sec)
mysql> select * from testaa where b <> '';
+---+------+----+
| a | b | c |
+---+------+----+
| 1 | aa | |
| 5 | aafa | fa |
+---+------+----+
2 rows in set (0.00 sec)
mysql> select * from testaa where b ='';
+---+------+---+
| a | b | c |
+---+------+---+
| 2 | | |
+---+------+---+
1 row in set (0.00 sec)
mysql> select * from testaa where b is null;
+---+------+---+
| a | b | c |
+---+------+---+
| 3 | NULL | |
| 4 | NULL | |
+---+------+---+
mysql> select length(b),length(c) from testaa;
+-----------+-----------+
| length(b) | length(c) |
+-----------+-----------+
| 2 | 0 |
| 0 | 0 |
| NULL | 0 |
| NULL | 0 |
| 4 | 2 |
+-----------+-----------+
5 rows in set (0.00 sec)
mysql> select count(b),count(c) from testaa;
+----------+----------+
| count(b) | count(c) |
+----------+----------+
| 3 | 5 |
+----------+----------+
1 row in set (0.00 sec)
mysql> create table testbb ( a int primary key , b timestamp);
Query OK, 0 rows affected (0.07 sec)
mysql> show create table testbb;
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| testbb | CREATE TABLE `testbb` (
`a` int(11) NOT NULL,
`b` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
mysql> insert into testbb vales (1,null) ;
mysql> insert into testbb values (2,'');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+
mysql> select * from testbb;
+---+---------------------+
| a | b |
+---+---------------------+
| 1 | 2014-08-15 14:32:10 |
| 2 | 0000-00-00 00:00:00 |
+---+---------------------+
2 rows in set (0.00 sec)
注意事项:
1:在进行count()统计某列的记录数的时候,如果采用的NULL值,会别系统自动忽略掉,但是空值是会进行统计到其中的。
2: 判断NULL 用IS NULL 或者 is not null,SQL 语句函数中可以使用ifnull()函数来进行处理,判断空字符用=''或者 <>''来进行处理
3: 对于MySQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插入的列插入NULL值,则出现的值是当前系统时间。插入空值,则会出现 '0000-00-00 00:00:00'
4:对于空值的判断到底是使用is null 还是 =''要根据实际业务来进行区分。
参考技术B MySQL中null和空值的区别:
"空值"是不占用空间的;Mysql 中null值是未知的,占用空间的,并且不走索引,
参考技术C NULL是有值的,在MYSQL中有它自己的表示方法,而且在逻辑运算的时候,比如2 AND NULL 结果为NULL

可是空值代表没有这项,运算的时候不考虑.

所以php读出来的时候是不一样的NULL不知道是什么数值(我忘记了),空串会显示没有这项(为空,要不就是会出错,我忘记了)`~

所以编程的时候自己要注意自己数据库里存了什么.记得的话,应该不再会遇到这种问题了.
参考技术D null是不占字符空间的 “”是占有字符空间的

以上是关于MySQL 中NULL和空值的区别的主要内容,如果未能解决你的问题,请参考以下文章

access 查询空值和null值的区别

MySQL的空值和NULL区别

mysql的空值与NULL的区别

数据库中的空值与NULL的区别以及python中的NaN和None

数据库中的空值与NULL的区别以及python中的NaN和None

你还不知道mysql中空值和null值的区别吗?