#### 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)列，插入当前日期和时间。如果你插入`空值`放入具有`自动递增`属性，插入序列中的下一个数字。
