首页 > 数据库 >mysql中null与“空值”的坑

mysql中null与“空值”的坑

时间:2023-04-01 10:09:59浏览次数:50  
标签:NULL col1 空值 插入 mysql test null

字段属性的"空值"与"NULL"不一样

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

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

2、为毛not null的效率比null高

3、判断字段不为空的时候,到底要  select * from table where column <> '' 还是要用 select * from table where column is not null 呢。

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

空值” 和 “NULL” 的概念

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

1、空值是不占用空间的

2、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.”

PS:打个比方来说,你有一个杯子,空值代表杯子是真空的,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');

现在表中数据:

mysql中null与“空值”的坑_字段

现在根据需求,我要统计test表中col1不为空的所有数据,我是该用“<> ''” 还是 “IS NOT NULL” 呢,让我们来看一下结果的区别。

SELECT * FROM `test` WHERE col1 IS NOT NULL

mysql中null与“空值”的坑_字段_02

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

"is not null " 和 "!=null"

在筛选非空的字段经常会用到"is not null"和"!=null",但是这两种方法是不一样的!!!!
Why?????而"null" 表示什么也不是, 用“=、>、< ...” 所有的判断,结果都是false,所有只能用 is null进行判断。默认情况下,推荐使用 IS NOT NULL去判断,因为SQL默认情况下对。"!= Null"的判断会永远返回0行,但没有语法错误。如果你一定想要使用"!= Null"来判断,需要加上这个语句:“set ANSI_NULLS off”这时你会发现“IS NOT NULL” 和 “!= null” 是等效的。

标签:NULL,col1,空值,插入,mysql,test,null
From: https://blog.51cto.com/706054oyu/6163408

相关文章

  • 力扣603(MySQL)-连续空余座位(简单)
    题目:几个朋友来到电影院的售票处,准备预约连续空余座位。你能利用表cinema,帮他们写一个查询语句,获取所有空余座位,并将它们按照seat_id排序后返回吗? 对于如上样例,你的查询语句应该返回如下结果。注意:seat_id字段是一个自增的整数,free字段是布尔类型(‘1’表示空余,‘0......
  • mysql分组并每组添加序号
    --模拟表select*fromtb_test;--rownum判断@pre_parent_code是否和当前的parent_code一样,true:让@i+=1false:重置@i--再定义一个变量@pre_parent_code:=''再存上一个parent_code,只要pre_parent_code不等于当前的parent_code让@i:=0else@i+=1就ok了-......
  • Oracle与Mysql 的区别(对比学习)
    Oracle与Mysql的区别(对比学习)使用范围Oracle是大型的数据库。Oracle是收费的,且价格昂贵Mysql是中小型数据库。Mysql是开源的安装部署Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能Mysql安装完后才152M端口用户Oracle默认端口1521,默认用户是s......
  • Lixnu:如何安装、启用、访问云服务器中的MySQL数据库?
    Linux系统:CentOS7MySQL版本:5.7.41安装方法:rpm安装(需要自己解决依赖问题)云服务器:阿里云MySQL客户端:Navicat  1、准备工作:软件配置本机是否有mysql软件:rpm-qa|grepmysql是否有冲突软件mariadb:rpm-qa|grepmariadb(如果有)卸载......
  • 项目一众筹网06_02给用户分配角色、执行用户角色的分配、提交的 只是我们选中的解决、
    项目一众筹网06_02项目一众筹网06_02文章目录项目一众筹网06_0209-Admin分配Role-执行分配-handler方法(执行角色分配的后端代码开始)隐藏域的东西,不用传,点击submit(提交)的时候就会传过去,如下图允许参数是空值10-Admin分配Role-执行分配-Service方法==重复问题==11-Admin分配Role-执行......
  • 开心档之MySQL WHERE 子句
    MySQLWHERE子句我们知道从MySQL表中使用SQLSELECT语句来读取数据。如需有条件地从表中选取数据,可将WHERE子句添加到SELECT语句中。语法以下是SQLSELECT语句使用WHERE子句从数据表中读取数据的通用语法:SELECTfield1,field2,...fieldNFROMtable_name1,ta......
  • 开心档之MySQL 序列使用
    MySQL序列使用MySQL序列是一组整数:1,2,3,...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。本章我们将介绍如何使用MySQL的序列。使用AUTO_INCREMENTMySQL中最简单使用序列的方法就是使用MySQLAUTO_INCREMEN......
  • 使用EFCore的Code First和MySql数据库迁移(转载 )
    下辈子还当程序员 博客园首页新随笔联系订阅管理随笔-4  文章-0  评论-9  阅读- 44432使用EFCore的CodeFirst和MySql数据库迁移 1.感慨一下    随着.netcore的持续更新和升级,至少对于从事.net开发的人员和即将踏入这个领域......
  • mysql——null值和空值
    参考:https://blog.csdn.net/xp178171640/article/details/103065271?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-103065271-blog-107128984.235%5Ev27%5Epc_relevant_3mothn_strategy_and_data_recovery......
  • 【Java】删除String数组中的所有空值
    1、封装一个方法/****去除String数组中的空值*/privateString[]deleteArrayNull(Stringstring[]){StringstrArr[]=string;//step1:定义一个list列表,并循环赋值ArrayList<String>strList=newArrayList<String>();......