mysql中的null值和空值区别

转载 2016年05月30日 21:24:23
转载自:点击打开链接
标签: 笔记 mysql null | 发表时间:2014-06-06 23:46 | 作者:
出处:http://jackyrong.iteye.com

mysql中的null值和空值区别,注意到null值是未知的,占用空间,并且不走索引;下面转载两篇文笔记之: 


http://my.oschina.net/junn/blog/161769 

相信很多用了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” 的概念: 

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

打个比方来说,你有一个杯子,空值代表杯子是真空的,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 会参与字段比较,所以对效率有一部分影响。 

而且对表索引时不会存储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 <> '' 


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


--------------------------------- 

http://blog.csdn.net/eroswang/article/details/8529817 

Mysql数据库是一个基于结构化数据的开源数据库。SQL语句是MySQL数据库中核心语言。不过在MySQL数据库中执行SQL语句,需要小心两个陷阱。 

  陷阱一:空值不一定为空 

  空值是一个比较特殊的字段。在MySQL数据库中,在不同的情形下,空值往往代表不同的含义。这是MySQL数据库的一种特性。如在普通的字段中(字符型的数据),空值就是表示空值。但是如果将一个空值的数据插入到TimesTamp类型的字段中,空值就不一定为空。此时为出现什么情况呢 

  我先创建了一个表。在这个表中有两个字段:User_id(其数据类型是int)、Date(其数据类型是TimesTamp)。现在往这个表中插入一条记录,其中往Date字段中插入的是一个NULL空值。可是当我们查询时,其结果显示的却是插入记录的当前时间。这是怎么一回事呢?其实这就是在MySQL数据库中执行SQL语句时经常会遇到的一个陷阱:空值不一定为空。在操作时,明明插入的是一个空值的数据,但是最后查询得到的却不是一个空值。 

  在MySQL数据库中,NULL对于一些特殊类型的列来说,其代表了一种特殊的含义,而不仅仅是一个空值。对于这些特殊类型的列,各位读者主要是要记住两个。一个就是笔者上面举的TimesTamp数据类型。如果往这个数据类型的列中插入Null值,则其代表的就是系统的当前时间。另外一个是具有auto_increment属性的列。如果往这属性的列中插入Null值的话,则系统会插入一个正整数序列。而如果在其他数据类型中,如字符型数据的列中插入Null的数据,则其插入的就是一个空值。 

  陷阱二:空值不一定等于空字符 

  在MySQL中,空值(Null)与空字符(’’)相同吗?答案是否定的。 

  在同一个数据库表中,同时插入一个Null值的数据和一个’’空字符的数据,然后利用Select语句进行查询。显然其显示的结果是不相同的。从这个结果中就可以看出,空值不等于空字符。这就是在MySQL中执行SQL语句遇到的第二个陷阱。在实际工作中,空值数据与空字符往往表示不同的含义。数据库管理员可以根据实际的需要来进行选择。如对于电话号码等字段,可以默认设置为空值(表示根本不知道对方的电话号码)或者设置为空字符(表示后来取消了这个号码)等等。由于他们在数据库中会有不同的表现形式,所以数据库管理员需要区别对待。笔者更加喜欢使用空值,而不是空字符。这主要是因为针对空值这个数据类型有几个比较特殊的运算字符。如果某个字段是空字符,数据库中是利用字段名称来代替。相反,如果插入的是空值,则直接显示的是NULL。这跟其他数据库的显示方式也是不同的。 

  一是IS NULL 和IS NOT NULL关键字。如果要判断某个字段是否含用空值的数据,需要使用特殊的关键字。其中前者表示这个字段为空,后者表示这个字段为非空。在Select语句的查询条件中这两个关键字非常的有用。如需要查询所有电话号码为空的用户(需要他们补充电话号码信息),就可以在查询条件中加入is not null关键字。 

  二是Count等统计函数,在空值上也有特殊的应用。如现在需要统计用户信息表中有电话号码的用户数量,此时就可以使用count函数、同时将电话号码作为参数来使用。因为在统计过程中,这个函数会自动忽略空值的数据。此时统计出来的就是有电话号码的用户信息。如果采用的是空字符的数据,则这个函数会将其统计进去。统计刚才建立的两条记录时,系统统计的结果是1,而不是2。可见系统自动将Null值的数据忽略掉了。 

判断NULL用is null  或者 is not null。 sql语句里可以用ifnull函数来处理 

判断空字符串‘’,要用 ='' 或者 <>''。sql语句里可以用if(col,col,0)处理,即:当col为true时(非null,及非'')显示,否则打印0 


举报

相关文章推荐

MySql判断是否为null或空字符串

MySql判断是否为null或空字符串   判断方法:  if  ISNULL(aBegBalRule) || LENGTH(trim(aBegBalRule)) E...

mysql的空值与NULL的区别

Mysql数据库是一个基于结构化数据的开源数据库。SQL语句是MySQL数据库中核心语言。不过在MySQL数据库中执行SQL语句,需要小心两个陷阱。   陷阱一:空值不一定为空   空值是...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

数据库中空字符串和NULL值两个概念的区别

数据库中的NULL表示“没有对(列)变量输入数据”,即在数据库中的NULL可以区分“没有对(列)变量输入数据”和“有对(列)变量输入数据”这两类情况。而输入空字符串,则是这里的“有对(列)变量输入数据...

NULL与MySQL空字符串的区别

from:http://database.ctocio.com.cn/239/12208239.shtml     MySQL空字符串和NULL值我们都经常会见到,但是这二者并不是一个概念,下面...

MySQL中NULL和空值的区别

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

mysql查询语句select-(null,not null,is null和is not null)

1 一些概念     1.1 null与not null     null 和 not null是mysql的字段属性,或称为数据类型的属性,不属于任何类型。null值也不等同于空值,空值是不占用...

深入详解SQL中的Null

NULL 在计算机和编程世界中表示的是未知,不确定。虽然中文翻译为 “空”, 但此空(null)非彼空(empty)。 Null表示的是一种未知状态,未来状态,比如小明兜里有多少钱我不清楚,但也不能肯...

mysql中null与“空值”的坑

导读 数据库在企业环境中是非常常用的,不仅仅是DBA,运维人员和开发人员都要熟悉数据库的使用,增删改查等操作。而对于使用数据库的人员来说,对于字段、属性的熟悉是相当重要的。今天就给大家分享下mysq...

mysql中的null值和空值区别

转载自:点击打开链接 标签: 笔记 mysql null | 发表时间:2014-06-06 23:46 | 作者: 出处:http://jackyrong.iteye.com ...

mysql中null与空值的区别

Mysql的空值与NULL的区别   Mysql数据库是一个基于结构化数据的开源数据库。SQL语句是MySQL数据库中核心语言。不过在MySQL数据库中执行SQL语句,需要小心两个陷阱...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)