<强>经常用mysql的人可能会遇到下面几种情况:强>
1,我字段类型是不空,为什么我可以插入空值
2,为什么not null的效率比空高
3,判断字段不为空的时候,到底要用
从表中列选择* & lt;比;" >之前还是要用
select *从表列不是空带着上面几个疑问,我们来简单的研究一下零和not null到底有什么不一样,他们之间的区别是什么以及各自的效率问题。
<强>首先,我们要搞清楚“空值”和“空”的概念:强>
1,空值是不占用空间的
2, mysql中的空其实是占用空间的、下面是来自于mysql官方的解释
"空列需要额外空间行记录它们的值是否为空。MyISAM表,每个NULL列> 创建表“codetc”( 的col1 VARCHAR(10)字符集utf8核对utf8_general_ci非空, col2 VARCHAR(10)字符集utf8核对utf8_general_ci NULL )=MYISAM引擎;
插入数据:
插入“codetc”值(空1);
mysql发生错误:
<代码> # 1048 -列col1”不能null 代码>
再来一条
插入codetc”值(1),
成功插入。
可见,非空的字段是不能插入“空”的,只能插入“空值”,上面的问题1也就有答案了。
对于问题2,上面我们已经说过了,空其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,零会参与字段比较,所以对效率有一部分影响。
而且B树索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。
我们再向codetc的表中插入几条数据:
插入“codetc”值(NULL); 插入“codetc”值(' 1 ',' 2 ');
现在根据需求,我要统计codetc表中col1不为空的所有数据,我是该用“& lt;比;”“还是“不空”呢,让我们来看一下结果的区别。
SELECT *从‘codetc col1不是零; SELECT * FROM‘codetc col1 & lt;比;”;
可以看的到,结果迥然不同,所以在实际情况中,我们一定要根据业务需求,搞清楚是否需要使用null或者不是零。
注意:MySQL字段尽量避免空,应该指定列不为NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,而且对表索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。因为它们使得索引,索引的统计信息以及比较运算更加复杂。你应该用0,一个特殊的值或者一个空串代替空值。
<强> mysql设置字段非空变成空强>
语句:
改变表的表名修改字段名VARCHAR(20)默认空