百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> MySQL中NULL和NOT NULL详解
分享文章到:

MySQL中NULL和NOT NULL详解

发布时间:09/01 来源:未知 浏览: 关键词:
这篇小短文讲的是啥

此前看到有人问到 PHPHub 迁移数据库文件中 nullable 和索引的问题,信赖许多用了 MySQL 很久的人(特殊是平常过多关注业务开发的人),对这两个字段属性的概念还不是很分明,一样会有以下疑问:

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

为毛 not null 的效力比 null 高;

推断字段不为空的时候,到底要 column <> '' 还是要用 column is not null 呢。

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

null 和 空值 一样么

第一,我们要搞分明 空值 和 null 的概念:

空值 是不占用空间的;

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” 的概念之后,问题根本就明了了,我们搞个例子测试一下:

CREATE TABLE  `test` (
     `col1` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
     `col2` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL
 ) ENGINE = MYISAM ;

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

施行下面的 SQL,发生错误,提醒 Column 'col1' cannot be null。

INSERT INTO `test` VALUES ( null, 1);

再来一条,施行成功。

INSERT INTO `test` VALUES ('',1);

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

问题 2:为毛 not null 的效力比 null 高?

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

并且 B 树索引时不会储备 NULL 值的,所以假如索引的字段可认为 NULL,索引的效力会下落许多。

问题 3:推断字段不为空的时候,到底要 column<>'' 还是要用 column is not null 呢。

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

INSERT INTO `test` VALUES ('', NULL);
INSERT INTO `test` VALUES ('1', '2');

此刻按照需求,我要统计 test 表中 col1 不为空的所有数据,我是该用 <>'' 还是 IS NOT NULL 呢,让我们来看一下结果的不同。

此刻表中的数据如下:

微信截图_20200505105438.png

离别对比以下两句 SQL 的施行结果

SELECT * FROM `test` WHERE col1 IS NOT NULL

微信截图_20200505105447.png

SELECT * FROM `test` WHERE col1 <> ''

微信截图_20200505105500.png

可以看到,结果截然不同,所以我们必然要按照业务需求,搞分明到底是要用那种搜索前提,乃至要不要为 null。

本人碰到的一个小坑

在好久之前刚入职做第一个需求上线的时候,只一味留意到说是 not null 的效力比 null 的效力高。

好嘛~本人在现有的表上增添字段时全设定为了 not null,感受本人屌屌的。

由于很多 Service 都有操纵这个表的插入动作,结果不言而喻,刚上线,错误 Column 'col1' cannot be null 布满了整个开发组每个人的邮箱。

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

以上就是MySQL中NULL和NOT NULL详解的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板