#### B.3.4.3 NULL 值问题 [](<>)[](<>) 的概念`空值`对于 SQL 新手来说,value 是一个常见的混淆来源,他们经常认为`空值`与空字符串相同`''`.不是这种情况。例如,以下陈述完全不同: ``` mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES (''); ``` 两个语句都向`电话`列,但第一个插入一个`空值`值,第二个插入一个空字符串。第一个的意思可以认为是“电话号码不知道”,第二个的意思可以认为是“知道这个人没有电话,因此没有电话号码”。 为了帮助`空值`处理,您可以使用[`一片空白`](comparison-operators.html#operator_is-null)和[`不为空`](comparison-operators.html#operator_is-not-null)运营商和[`IFNULL()`](flow-control-functions.html#function_ifnull)功能。 在 SQL 中,`空值`与任何其他值相比,值永远不会为真,即使`空值`.包含的表达式`空值`总是产生一个`空值`值,除非在文档中针对表达式中涉及的运算符和函数另有说明。以下示例中的所有列都返回`空值`: ``` mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL); ``` 搜索列值`空值`, 你不能使用`表达式 = NULL`测试。以下语句不返回任何行,因为`表达式 = NULL`对于任何表达式都不是真的: ``` mysql> SELECT * FROM my_table WHERE phone = NULL; ``` 寻找`空值`值,您必须使用[`一片空白`](comparison-operators.html#operator_is-null)测试。以下语句显示如何找到`空值`电话号码和空电话号码: ``` mysql> SELECT * FROM my_table WHERE phone IS NULL; mysql> SELECT * FROM my_table WHERE phone = ''; ``` 看[第 3.3.4.6 节,“使用 NULL 值”](working-with-null.html),以获取更多信息和示例。 您可以在可以具有的列上添加索引`空值`如果您使用的是值`MyISAM`,`InnoDB`, 要么`记忆`存储引擎。否则,您必须声明一个索引列`非空`,并且您不能插入`空值`入列。 [](<>) 读取数据时[`加载数据`](load-data.html), 空列或缺失列更新为`''`.加载一个`空值`值到列中,使用`\N`在数据文件中。字面意思`空值`在某些情况下也可以使用。看[第 13.2.7 节,“加载数据语句”](load-data.html). 使用时`清楚的`,`通过...分组`, 要么`订购方式`, 全部`空值`值被视为相等。 使用时`订购方式`,`空值`值首先显示,如果您指定,则最后显示`DESC`以降序排序。 聚合(组)功能,例如[`数数()`](aggregate-functions.html#function_count),[`最小()`](aggregate-functions.html#function_min), 和[`和()`](aggregate-functions.html#function_sum)忽视`空值`价值观。例外情况是[`数数(*)`](aggregate-functions.html#function_count),它计算行而不是单个列值。例如,以下语句产生两个计数。第一个是统计表中的行数,第二个是统计非行数`空值`中的值`年龄`柱子: ``` mysql> SELECT COUNT(*), COUNT(age) FROM person; ``` [](<>)[](<>)[](<>)[](<>) 对于某些数据类型,MySQL 处理`空值`特别重视。如果你插入`空值`成一个[`时间戳`](datetime.html)列,插入当前日期和时间。如果你插入`空值`放入具有`自动递增`属性,插入序列中的下一个数字。