null 表示什么也不是, 不能=、>、< … 所有的判断,结果都是false,所有只能用 is null进行判断。

转自:https://segmentfault.com/a/1190000009540449

相信很多用了MySQL很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问:

  1. 我字段类型是not null,为什么我可以插入空值
  2. 为毛not null的效率比null
  3. 判断字段不为空的时候,到底要 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 |+------------+--------------+--------------+

注意事项:

  1. 在进行count()统计某列的记录数的时候,如果采用的NULL值,系统会自动忽略掉,但是空值是会进行统计到其中的。
  2. 判断NULL 用IS NULL 或者 IS NOT NULLSQL语句函数中可以使用ifnull()函数来进行处理,判断空字符用=''或者 <>''来进行处理
  3. 对于MySQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插入的列插入NULL值,则出现的值是当前系统时间。插入空值,则会出现 0000-00-00 00:00:00
  4. 对于空值的判断到底是使用is null 还是='' 要根据实际业务来进行区分。

MySQL null与not null和null与空值‘‘的区别相关推荐

  1. mysql null 排前面_Mysql实现null值排在最前/最后的方法示例

    前言 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. 为了处理这种情况,MyS ...

  2. 为什么 MySQL 不推荐默认值为 null ?

    作者 | guangsu. 来源 | https://blog.csdn.net/qq_30549099/article/details/107395521 通常能听到的答案是使用了NULL值的列将会 ...

  3. mysql设置text字段为not null,并且没有默认值,插入报错:doesn't have a default value

    一.问题描述 在往数据库写入数据的时候,报错: '字段名' doesn't have a default value 本来这个错误是经常见到的,无非就是字段没有设置默认值造成的.奇怪的是,我这边报错的 ...

  4. MySQL非空约束(NOT NULL)

    MySQL 非空约束(NOT NULL)可以通过 CREATE TABLE 或 ALTER TABLE 语句实现.在表中某个列的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空 ...

  5. MySQL 中NULL和空值的区别

    平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解.注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效 ...

  6. mysql boolean_产品操作MySQL第7篇 – 运算符 – IS NULL

    本资料为产品岗位作为日常工作参考,语言口语化 At 2019/4/27 By David.Yang 介绍什么是IS NULL IS NULL作为一种运算符,用来对数据表中的NULL值数据进行过滤. 语 ...

  7. mysql两个字段相减_MySQL 中NULL和空值的区别?

    作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值.那你知道它们有什么区别吗? 学不动了,也不想知道它们有什么区别.大兄弟,不行啊,要面试! 前些天我 ...

  8. MySQL中order by中关于NULL值的排序问题

    MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们 ...

  9. Mysql 数据库默认值选 ‘‘“ 、Null和Empty String的区别

    Mysql 数据库默认值选 ''" .Null和Empty String的区别 1:空值('')是不占用空间的 2: MySQL中的NULL其实是占用空间的.官方文档说明: "NU ...

  10. mysql 删除not null_从MySQL的列中删除NOT NULL限制?

    要从MySQL的列中删除NOT NULL限制,请使用ALTER命令.语法如下:ALTER TABLE yourTableName MODIFY COLUMN yourColumnName dataTy ...

最新文章

  1. Angel:深度学习在腾讯广告推荐系统中的实践
  2. QIIME 2教程. 28社区Community(2021.2)
  3. 信息熵是什么 转 理论吃透的创新解释
  4. Spring Cloud中Hystrix仪表盘与Turbine集群监控
  5. 计算机查找文件的速度,如何快速搜索文件_怎么加快电脑里的文件搜索速度
  6. python视频教程从入门到精通全集-python从入门到精通视频(全60集)免费高速下载...
  7. python代码案例详解-新手必学Python爬虫之Scrapy框架案例详解
  8. 例子---PHP与Form表单之一
  9. 使用换IP软件的代理IP速度缓慢的原因是什么?详解!
  10. 计算机网络原理基础知识点总结
  11. k3 lede刷官改_斐讯K3路由LEDE固件刷回官方原版固件
  12. 如何将DVD的vob视频格式转换成mp4格式
  13. android+cortana+语音唤醒,为什么语音唤醒Cortana咒语是“你好,小娜”?
  14. Voldemort的FailureDetector设计
  15. 线性空间2--子空间
  16. leetcode 1217. 玩筹码
  17. google提供免费企业邮局
  18. 直流电机驱动电路应用
  19. XctNet:从单个X射线图像重建体积图像的网络
  20. 怎样把xp计算机语言改为英文,xp系统电脑语言改成英文的恢复步骤

热门文章

  1. Silverlight 参考: Path的Data生成归总
  2. 诗与远方:无题(二十一)
  3. The used SELECT statements have a different number of columns 错误解决
  4. SQL中不建议使用 where 1=1 的说法,是错误的
  5. Spring,SpringMvc初始化监听配置
  6. JAVA设计模式 - 代理模式
  7. HDOJ-1019 Least Common Multiple
  8. Java 总结finalize()方法
  9. Java 面向对象:封装详解
  10. zanli_android_1.1.0,【轻松集赞】写了个涉嫌混淆微信官方服务的小程序