MySQL null与not null和null与空值''的区别
参考连接:https://segmentfault.com/a/1190000009540449
相信很多用了MySQL
很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问:
- 我字段类型是
not null
,为什么我可以插入空值 - 为毛
not null
的效率比null
高 - 判断字段不为空的时候,到底要
select * from table where column <> ''
还是要用select * from table wherecolumn is not null
呢。
带着上面几个疑问,我们来深入研究一下null 和 not 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 ;
插入数据:
INSERT INTO `test` VALUES (null,1);
mysql发生错误:
#1048 - Column 'col1' cannot be null
再来一条
INSERT INTO `test` VALUES ('',1);
成功插入。
可见,NOT NULL 的字段是不能插入“NULL”的,只能插入“空值”,上面的问题1
也就有答案了。
对于问题2
,上面我们已经说过了,NULL 其实并不是空值,而是要占用空间
,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。
而且B树索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多
。
我们再向test的表中插入几条数据:
INSERT INTO `test` VALUES ('', NULL);
INSERT INTO `test` VALUES ('1', '2');
现在表中数据:
现在根据需求,我要统计test表中col1不为空的所有数据,我是该用“<> ''”
还是 “IS NOT NULL” 呢,让我们来看一下结果的区别。
SELECT * FROM `test` WHERE col1 IS NOT NULL
SELECT * FROM `test` WHERE col1 <> ''
可以看到,结果迥然不同,所以我们一定要根据业务需求,搞清楚到底是要用那种搜索条件
。
MYSQL建议列属性尽量为NOT NULL
长度验证:注意空值的''之间是没有空格的。
mysql> select length(''),length(null),length(' ');
+------------+--------------+--------------+
| length('') | length(null) | length(' ') |
+------------+--------------+--------------+
| 0 | NULL | 2 |
+------------+--------------+--------------+
注意事项:
- 在进行
count()
统计某列的记录数的时候,如果采用的NULL
值,系统会自动忽略掉,但是空值是会进行统计到其中的。 - 判断
NULL
用IS NULL
或者IS NOT NULL
,SQL
语句函数中可以使用ifnull()
函数来进行处理,判断空字符用=''
或者<>''
来进行处理 - 对于
MySQL
特殊的注意事项,对于timestamp
数据类型,如果往这个数据类型插入的列插入NULL
值,则出现的值是当前系统时间。插入空值,则会出现0000-00-00 00:00:00
- 对于空值的判断到底是使用
is null
还是=''
要根据实际业务来进行区分。
MySQL null与not null和null与空值''的区别的更多相关文章
- MySQL 中NULL和空值的区别
平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解.注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效 ...
- MySQL 中NULL和空值的区别 (转载 http://blog.sina.com.cn/s/blog_3f2a82610102v4dn.html)
平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解.注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效 ...
- MySQL中order by中关于NULL值的排序问题
MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们 ...
- {MySQL完整性约束}一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业
MySQL完整性约束 阅读目录 一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业 一 ...
- Mysql报错java.sql.SQLException:null,message from server:"Host '27,45,38,132' is not allowed to connect
Mysql报错java.sql.SQLException:null,message from server:"Host '27,45,38,132' is not allowed to co ...
- MySQL 中NULL和空值的区别,索引列可以有空值或者null吗?
空值跟null的区别.mysql官方: “NULL columns require additional space in the row to record whether their values ...
- MySQL学习笔记:少用Null
在实际编程中,Null容易引起很多问题,例如在Java里NullPointerException猝不及防的空指针异常,因此需要过多的if判断,甚是麻烦. 在MySQL数据库中也要少用Null,尽量保持 ...
- mysql 查询出的数组为null怎么转换成0
mysql 查询出的数组为null怎么转换成0 IFNULL(b.dayPay,0) as yesterdayPay,
- 【面试】MySQL 中NULL和空值的区别?
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 01 小木的故事 作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值.那 ...
随机推荐
- C语言强化——链表(2)
目录 链表的应用: 栈 循环队列 C语言实现动态数组 数组实现定长元素个数层次建树 队列实现不定元素个数层次建树 (*) 栈 栈(链表应用) "stack.h" #include ...
- GRE协议
一. GRE(Generic Routing Encapsulation) 通用路由封装 是对某些网络层协议(如: IP , IPX , Apple Talk等)的数据报进行封装,使这些被封装的数据报 ...
- [UE4]GameplayAbilities,技能系统插件
Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(七)Ability的信息传递等 Unreal Engine 4(虚幻UE4)GameplayAbili ...
- 两种解决方法 PHP Warning: File upload error - unable to create a temporary file in Unknown
原因:上传文件时,没有管理员权限的你不能读取临时文件夹; 解决方法(两种)找到临时文件夹并给当前访问用户所有权限; 方法一: 找到Apache默认的临时文件,步骤如下: 1.找到临时文件夹,一般在C: ...
- JDK1.6 Java.lang.Null.Pointer.Exception
先来看一下JDK1.6的API: NullPointerException (Java Platform SE 6) public class NullPointerException extends ...
- Sep 15th 2018
人在最困难的最孤独的时候,是否都会有过怀疑和产生退缩的念头呢.开始怀疑为什么要坚持,坚持的意义何在.我现在的状态就是一个谋生赚钱的机器吗,远离妻子和孩子,一人孤独的在这座城市,得到的难道能够足以弥补所 ...
- Delphi TstringList Stringlist的特殊用法
procedure TForm1.btn1Click(Sender : TObject); var m : Integer; s : string; strlst ...
- 新型DenseBody框架:一张照片获得3D人体信息
来自云从科技和上海交通大学的研究者近期提出一种新型框架 DenseBody,可直接从一张彩色照片中获取 3D 人体姿势和形状.该研究设计了一种高效的 3D 人体姿势和形状表示,无需中间表示和任务,端到 ...
- CS229 2.深入梯度下降(Gradient Descent)算法
1 问题的引出 对于上篇中讲到的线性回归,先化一个为一个特征θ1,θ0为偏置项,最后列出的误差函数如下图所示: 手动求解 目标是优化J(θ1),得到其最小化,下图中的×为y(i),下面给出TrainS ...
- elasticsearch无故关闭,Log无报错
可以看到图中的关闭log之前没有任务报错,这也让博主非常抓狂,这看着就像是人为关闭的,于是博主在群里问是不是有人动过该服务,确认没人关闭后,百度无果,社区上也没找到有关信息,最后灵光一闪,猜测是不是因 ...