例子1:
字段value2的属性不是NOT NULL
CREATE TABLE `test` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`value1` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '不为空',
`value2` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '可以为空',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
表里保存的数据如下:
执行查询:SELECT * FROM
test
WHERE value2 != '1'结果如下:
预期结果应该返回id为1、4、5的行,但是只返回id为5的行。
原因1:NOT IN、!= 等负向条件查询在有 NULL 值的情况下只返回非空行的结果集(NULL 值不会被查询)。
例子2:
执行操作:SELECT CONCAT('T','E',1,'test')
结果如下:
执行操作:SELECT CONCAT('T','E',null,'test')
原因2:使用 concat 函数拼接时,首先要对各个字段进行非 NULL 判断,否则只要任何一个字段为空都会造成拼接的结果为 NULL
例子3:
执行操作:SELECT COUNT(value2) FROM test;
原因3:当用count函数进行统计时,NULL 列不会计入统计
原因4:NULL 列需要更多的存储空间,一般需要一个额外的字节作为判断是否为 NULL 的标志位。
1、空值是不占用空间的
2、mysql中的NULL其实是占用空间的,下面是来自于MYSQL官方的解释:
“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”
NULL列需要在行中额外的空间来记录它们的值是否为NULL。对于MyISAM表,每个空列都多取一位,四舍五入到最近的字节。
打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的。
因为NULL 其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。(待认证)