mysql null与not null

创建数据库时,一般会设not null 和default null.
可是终极奥义是什么?
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都需要额外的空间,对于MyISAM 的表,NULL的列占用一个额外的一个比特,然后保存为最接近的字节数。
大致就翻译成这样吧,

验证:注意空值的”之间是没有空格的。

mysql> select length(”),length(null),length(’ ‘);
+————+————–+————–+
| length(”) | length(null) | length(’ ‘) |
| 0 | NULL | 2 |
+————+————–+————–+

搞清楚“空值”和“NULL”的概念之后,问题基本就明了了,我们搞个例子测试一下:

CREATE TABLE test (
col1 VARCHAR( 10 ) NOT NULL ,
col2 VARCHAR( 10 ) default NULL )
ENGINE = MYISAM ;

插入数据:

INSERT INTO test VALUES (null,1);

mysql发生错误:

1048 - Column ‘col1’ cannot be null

再来一条

INSERT INTO test VALUES (”,1);

成功插入。
可见,NOT NULL 的字段是不能插入“NULL”的,只能插入“空值”。

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

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 <> ”
这里写图片描述

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

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

引用:
http://blog.csdn.net/fwkjdaghappy1/article/details/7703974/
http://itindex.net/detail/49930-%E7%AC%94%E8%AE%B0-mysql-null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值