前言
许多小伙伴处理MySQL数据库中的数据时常常会看到某些字段的值为NULL,有些小伙伴可能会疑问NULL值到底有什么用,为什么很多人推荐在设置数据库字段属性时一定要设置成NOT NULL,那么对于实际开发中到底要不要把所有字段都设置成 NOT NULL呢?别急,首先我们得了解NULL 和NOT NULL之间的区别,这样咱们在查询数据时知道怎么处理NULL,也避免了在实际项目中碰到NULL处理不当而踩坑。
关于NULL的一些概念
1.1 NULL 与NOT NULL
NULL和NOT NULL都属于Mysql字段的属性,它不属于任何数据类型。NULL代表的是一个未知值,它既不等同于‘ ’(空值),也不同于0或者其他任何默认值,它和空值最大的区别是空值不占用空间,而NULL是占用存储空间的,比如在Myisam的表中NULL会占用 1 bit的额外空间。
在MySQL中,当一个字段没有被明确设置成NOT NULL时,数据库会默认为我们添加上NULL约束。有些开发人员在设计表的时候由于懒惰直接使用MySQL的默认推荐设置(允许该字段可使用NULL值)而导致在使用NULL的场景中得出不确定的查询结果以及引起数据库性能的下降。
那么,我们可以怎么处理NULL值呢?
- 使用is null或者is not null
is null和is not null是MySQL的运算符。当我们在查询字段值为NULL的时候应该使用is null而不能用“=”,因为NULL不等于任何其他值,优化器会把“= null”的查询给过滤掉而不返回任何数据;在查询字段值不为空的时候可以使用is not null。
SELECT * FROM User WHERE name IS NULL;
SELECT * FROM User WHERE name IS NOT NULL;
- 使用IFNULL()函数
IFNULL()函数有两个参数,如果第一个参数不是NULL则返回第一个参数,否则返回第二个参数。
SELECT IFNULL(score,0) FROM table_name;
可以使用 IFNULL()函数将所有的NULL值替换成指定的值。
- 使用COALESCE()函数
COALESCE()函数定义:返回参数里第一个不为NULL的的值,如果所有参数值都为NULL,则返回NULL。
COALESCE()函数有两种用法:
1.
COALESCE ( expression1, expression2 );
2.COALESCE ( expression1, expression2, ... expression-n );
其中第一种就相当于Oracle中的nvl或者mysql中的ifnull,写成表达式的形式为:
CASE WHEN expression1 IS NOT NULL THEN expression1 ELSE
expression2 END;
第二种可以包含n个表达式,表示如果第一个不为空取第一个,否则判断下一个,以此类推,如果全部为空,则返回null值。
- 使用DEFAULT关键字
在创建表时,可以为列指定DEFAULT值,如果插入数据时没有为该列提供值,MySQL将使用DEFAULT值。
CREATE TABLE User (
score INT DEFAULT 0
);
- 使用NOT NULL约束
在创建表时,可以为列添加NOT NULL约束,这将确保该列始终有一个值,即使是默认值。
CREATE TABLE User (
score INT NOT NULL DEFAULT 0
);
以上就是处理NULL值的几种方案。当然我们可以根据具体情况选择适合的方法。
总结
- 在设计数据库时,尽量避免允许NULL值,除非你有明确的理由。
- 使用合适的默认值代替NULL。
- 在查询时,总是考虑NULL值的情况,并使用适当的操作符和函数。
- 在应用程序逻辑中,正确处理来自数据库的NULL值。