NULL、NOT NULL与空值(“”)
NULL 与空值(“”)
- 字符串保存为NULL与“”的区别
select length(''),length(null),length(' ') ;
-- 0 NULL 1
- 空值不占用空间
- NULL占用空间
- 建表、初始化数据
-- 建表
CREATE TABLE `abc` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(10) NULL DEFAULT NULL,
`pass` VARCHAR(10) NOT NULL DEFAULT '',
`sex` VARCHAR(1) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
-- 初始化数据
insert into abc values(1,NULL,""," ");
insert into abc values(2,NULL,""," ");
insert into abc values(3,"",""," ");
- select count(xx) : NULL值被忽略,“”空值不会
select count(name) from abc ;
-- 1
select count(pass) from abc ;
-- 3
- select distinct(xx):无区别
select distinct name from abc ;
select distinct pass from abc ;
- 查询条件
select * from abc where name is not null ;
select * from abc where name <> "" ;
select * from abc where pass is not null ;
select * from abc where pass <> "" ;
- is not null / is null 针对 NULL 值进行判断
- <> “” / != “” / = “” 针对空值(“”) 进行判断
- 使用查询条件时根据业务场景及当前的字段值选择合适的非空查询条件
- 数据插入空字符串,会被截取存放,不会提示超过最大长度
NOT NULL 与 NULL
字段设置为NOT NULL ,DDL语句INSERT OR UPDATE 时尝试为字段设置NULL值,报错
索引:B+TREE索引不存储索引字段的NULL值;在MySQL中,含有空值的列很难进行查询优化,而且对表索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多
- MYSQL建议列属性尽量为NOT NULL;可以通过设置默认值来解决字段为NULL时的情况
- “可空列需要更多的存储空间”:需要一个额外字节作为判断是否为NULL的标志位
- NULL 改为 NOT NULL ,对于SQL性能提升不明显,性能优化时应优先考虑字段类型是否合适