存档

文章标签 ‘mysql NULL问题’

mysql使用NULL值问题

2017年5月3日 没有评论

Mysql中NULL值的概念会让刚接触MySql的用户引起混乱,他们经常会认为NULL值和空字符串”是相等的。其实他们是不同的,我在接触MySql一段时间以后,还是把这2种情况混为一谈。我们来看一下下面2个插入语句:


mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');

2个SQL语句都是向my_table表中的phone字段插入数据,但是第1个SQL插入1个空值(NULL值),而第2个插入的是1个空字符串。第1个可以理解为“我们还不知道用户的电话号码”,第2个SQL我们可以认为“我们知道这个人没有电话,所以并没有电话号码”,我们这是把它们附加到现实中可能会出现的2种业务情景中去。
为了便于处理空值(NULL值),我们可以使用”IS NULL”和”IS NOT NULL”操作符,或者使用IFNULL()函数。
在SQL使用的时候,在空值与其他任何其他值比较时都不会为真,即使比较的值也是1个空值。包含NULL的表达式总会产生一个NULL,除非是文档中另有说明的运算符和函数设计的表达式。下面的这些例子都会返回NULL:

mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);

如果要搜索列中为NULL的值,你不能使用 expr=NULL.下面的语句不会返回任何记录,因为expr=NULL对任何表示永远都不会返回真。

mysql> SELECT * FROM my_table WHERE phone = NULL;

要搜索列中为NULL的值,你必须要使用IS_NULL来匹配。下面的语句展示了如何寻找为NULL的手机号码和为空的手机号码。


mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';

要了解更多NULL相关的信息和例子,请查看 Section 4.3.4.6, “Working with NULL Values”
如果你在使用MyISAM,InnoDB,或者MEMORY存储引擎,你可以在包含NULL的列上加索引。除此以为你必须把索引列声明为NOT NULL,而且你也不能插入NULL到这个字段。
当你使用LOAD DATA INFILE来读取数据时,空或者缺失的列会被当做”处理。要加载NULL值到1个列中,请在你的数据文件中使用\N。字面意思的NULL也可能在某些特殊情况下使用。具体请查看14.2.6节”LOAD DATA INFILE语法”
当使用DISTINCT,GROUP BY,或ORDER BY,所用NULL被认为是相同的。
当使用ORDER BY时,NULL值会被排在第一个,如果你指出desc倒序排序时会排在最后一个。
统计函数如COUNT(),MIN(),和SUM()会忽略NULL值。表达式COUNT(*)会统计行数而不是单个列的值。例如,下面的语句会产生2次计数统计。第一个语句统计这个表中所用的行数,第二格语句统计age列不是NULL值的数量。

mysql> SELECT COUNT(*), COUNT(age) FROM person;

对某些数据类型,MySQL会特殊处理其中的NULL值。如果你要插入NULL到1个TIMESTAMP列,当前的时间会被插入进去(手册版本为MySQL5.7)。如果你要插入NULL值到整形或者浮点型的带有AUTO_INCREMENT属性自增列,下1个自增的数字会被插入。

本文是对MySQL5.7中手册的翻译,原文地址https://dev.mysql.com/doc/refman/5.7/en/problems-with-null.html,如有错误请指正。