MySQL中零和NOT NULL一样吗?

  

之前看到有人问到PHPHub迁移数据库文件中可空和索引的问题,相信很多用了MySQL很久的人(特别是平时过多关注业务开发的人),对这两个字段属性的概念还不是很清楚,一般会有以下疑问:

我字段类型是不空,为什么我可以插入空值;

为毛not null的效率比空高;

判断字段不为空的时候,到底要列& lt;比;& # 39;& # 39;还是要用列不是零呢。

带着上面几个疑问,我们来深入研究一下零和not null到底有什么不一样。

<强>零和空值一样么

首先,我们要搞清楚空值和空的概念:

空值是不占用空间的;

MySQL中的空其实是占用空间的、下面是来自于MySQL官方的解释:

空列需要额外空间行记录它们的值是否为空。MyISAM表,每个NULL列>创建表“测试”(   的col1 VARCHAR(10)字符集utf8核对utf8_general_ci非空,   col2 VARCHAR(10)字符集utf8核对utf8_general_ci NULL   )=MYISAM引擎;

问题1:我字段类型是不空,为什么我可以插入空值吗?

执行下面的SQL,发生错误,提示列& # 39;col1 # 39;不能空。

插入测试的值(空1);

再来一条,执行成功。

插入“测试”值(& # 39;& # 39;1);

可见,非空的字段是不能插入空的(这不是废话么,),只能插入空值,上面的问题1也就有答案了。

问题2:为毛NOT null的效率比空高?

对于问题2,上面我们已经说过了,空其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,零会参与字段比较,所以对效率有一部分影响。

而且B树索引时不会存储null值的,所以如果索引的字段可以为null,索引的效率会下降很多。

问题3:判断字段不为空的时候,到底要column<祝辞& # 39;& # 39;还是要用列不是零呢。

我们再向测试的表中插入几条数据:

插入“测试”值(& # 39;& # 39;零);   插入“测试”值(& # 39;1 & # 39;& # 39;2 & # 39;);

现在根据需求,我要统计测试表中col1不为空的所有数据,我是该用& lt;祝辞& # 39;& # 39;还是没有空呢,让我们来看一下结果的区别。

现在表中的数据如下:

 MySQL中零和NOT NULL一样吗?

分别对照以下两句SQL的执行效果

SELECT *从“测试”col1不是空

 MySQL中零和NOT NULL一样吗?

SELECT *从“测试”col1 & lt;比;& # 39;& # 39;

 MySQL中零和NOT NULL一样吗?

可以看的到,结果迥然不同,所以我们一定要根据业务需求,搞清楚到底是要用那种搜索条件,以及要不要为NULL。

<>强自己遇到的一个小坑

在许久以前刚入职做第一个需求上线的时候,只一味注意到说是NOT NULL的效率比零的效率高。

好嘛~自己在现有的表上增加字段时全设置为了不是NULL,感觉自己屌屌的。

因为许多服务都有操作这个表的插入动作,结果可想而知,刚上线,错误& # 39;列col1 # 39;不能空弥漫了整个开发组每个人的邮箱。

所以,当业务量不是很大的情况下,很多技术的使用其实都需要根据实际状况综合考虑。

以上就是MySQL中零和NOT null详解的详细内容,更多请关注其它相关文章!

MySQL中零和NOT NULL一样吗?