NULL值在一些语句中的使用
以INT列为例,对一个允许为NULL的字段进行min,max,sum,加减,order
by ,group by,distinct等操作的时候。如果默认不是0,操作将会很明确,如果使用NULL,需要清楚的知晓如下规则:
1) NULL值在min/max/sum中会被直接忽略掉
2) 对NULL值进行加减,如SET a=a+1,其结果仍旧是NULL
3) order by字段的时候NULL会排在最前面(以升序,如果是倒序则相反)
4) group
by/distinct时,NULL值被视为相同的值
5) 如果在字段插入一个NULL及非INT类型的值,这个字段的值将变成0。
在字符列中
1) 如果字段是字符,目测字段值,你无法区分这个值到底是NULL还是字符串’NULL’
2) 当企图统计title的值小于1000的总行数时,你会发现,NULL值不包括在里面。
3) 同理,如果你用length去统计一个VARCHAR的长度时,NULL返回的将不是数字。
不使用DEFALUT NULL的原因
NULL本身是一个特殊的值,MySQL采用特殊的办法来处理NULL,针对默认NULL的字段的查询、赋值存在着各种各样的与此相对应的情况需要去关心。它既不是数字,也不是字符。你必须使用IS NULL/IS NOT NULL这种与普通SQL大相径庭语句去查询,使用INSERT(‘a’,NULL,’b’)去插入,却又使用SET 字段=NULL去变更。
在存储上,它通过进制转换结合表字段属性来确认哪些字段的值是NULL,MySQL不得不额外每次走到这个分支上去确定字段的值,而不是像普通的INT,VARCHAR等。存储上前面统一放长度,后面放数据。在NULL上的各种查询可能会并不合你的本意。
所以,尽管它有些时候可能会比空值节省空间,在索引上也不比空值差,但是为了避免在其身上各种特殊性导致的问题,我们舍弃掉了NULL。




