MySQL 中NULL和空值的区别,索引列是否可空值或null

在建立表的时候尽可能把字段的默认值设置成 not null,除非你想存储null;由于在mysql中为null的的字段不会走索引,作统计的时候也不会被统计进去,若是想统计进去必须作特定的处理,这样作比较复杂。能够给字段的值设置成0、一个特殊的值或者一个空串代替空值。mysql

MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。
可空列须要更多的储存空间,还须要在MySQL内部进行特殊处理。当可空列被索引的时候,
每条记录都须要一个额外的字节,还可能致使 MyISAM 中固定大小的索引(例如一个整数列上的索引)变成可变大小的索引。 sql

建立表函数

CREATE TABLE test_null (
 `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT '' ,
  `name_null` varchar(32) DEFAULT NULL,
  `name_empty` varchar(32)  DEFAULT '',
  PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

优化

(1)在进行count()统计某列的记录数的时候(null不会统计进来)或者查询不是某个值的时候(null值不会查出来),可是空值是会进行统计到其中的。当咱们作一些统计表的时候若是统计的数据总是不对的时候,须要考虑值为null的字段blog

 

  若是我想查找name_null不是张三的个数,若是where子句直接是name_null <> '张三',并无把name_null为null的状况统计进来。sql以下:索引

 

以上的统计数据不是咱们想要的结果这个时候须要作特殊的处理:sql以下:先在where子句中控制须要的数据,而后用count(*)作统计,因此有的时候能够用count(地段)作统计数量,有的时候不能够class

你们能够试试统计name_empty默认值给空的字段test

(2)MySQL中的NULL实际上是占用空间的,空值('')是不占用空间的sql语句

(3)判断NULL 用IS NULL 或者 is not null,在sql语句中能够用IFNULL(expr1,expr2)函数,若是想判断空字符用=''或者 <>、!=''来进行处理。引用