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

   问题 1: 首先,我们需要搞清楚 "空值" 和"NULL"的概念:
    1:空值('')是不占用空间的
    2: MySQL中的NULL其实是占用空间的。官方文档说明:
“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.” 
长度验证:注意空值的''之间是没有空格的。
mysql> select length(''),length(null),length('  ');
+------------+--------------+--------------+
| length('') | length(null) | length('  ') |
+------------+--------------+--------------+
|          0 |         NULL |            2 |
+------------+--------------+--------------+
 
   问题2:
判断字段不为空的时候,查询语句到底是用 select * from  tablename  where columnname <> '' 还是用
select * from tablename where column is not null,2个查询语句有啥不同。

eg:

mysql> show create table testaa;
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                         |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| testaa | CREATE TABLE `testaa` (
  `a` int(11) NOT NULL,
  `b` varchar(20) DEFAULT NULL,
  `c` varchar(20) NOT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
 
插入测试数据:
mysql> insert testaa  values (1,'aa','');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa  values (2,'','');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa  values (3,null,'');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa  values (4,NULL,'');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa  values (5,'aafa','fa');
Query OK, 1 row affected (0.00 sec)
 
mysql> insert testaa values (6,'',NULL);
ERROR 1048
(23000): Column 'c' cannot be null
 
mysql>
select *
from testaa;
+---+------+----+
| a
| b  
 | c  |
+---+------+----+
| 1
| aa
  |    |
| 2
|  
   |  
 |
| 3
| NULL
|  
 |
| 4
| NULL
|  
 |
| 5
| aafa
| fa |
+---+------+----+
 
查询验证过程:
 
mysql>
select *
from testaa
where c
is not
null;
+---+------+----+
| a
| b  
 | c  |
+---+------+----+
| 1
| aa
  |    |
| 2
|  
   |  
 |
| 3
| NULL
|  
 |
| 4
| NULL
|  
 |
| 5
| aafa
| fa |
+---+------+----+
5 rows
in set
(0.00
sec)
 
mysql>
select *
from testaa
where c
<> '';
+---+------+----+
| a
| b  
 | c  |
+---+------+----+
| 5
| aafa
| fa |
+---+------+----+
1 row
in set
(0.00
sec)
mysql>
select *
from testaa
 where
c = '';
+---+------+---+
| a
| b  
 | c |
+---+------+---+
| 1
| aa
  |   |
| 2
|  
   |  
|
| 3
| NULL
|   |
| 4
| NULL
|   |
+---+------+---+
4 rows
in set
(0.00
sec) 
 
mysql> select * from testaa where  c
is null;
Empty
set (0.00 sec)
 
 
mysql>
select *
from testaa
where b
is not
null;
+---+------+----+
| a
| b  
 | c  |
+---+------+----+
| 1
| aa
  |    |
| 2
|  
   |  
 |
| 5
| aafa
| fa |
+---+------+----+
3 rows
in set
(0.00
sec)
 
mysql>
select *
from testaa
where b
<> '';
+---+------+----+
| a
| b  
 | c  |
+---+------+----+
| 1
| aa
  |    |
| 5
| aafa
| fa |
+---+------+----+
2 rows
in set
(0.00
sec)
 
mysql>
select *
from testaa
where b
='';
+---+------+---+
| a
| b  
 | c |
+---+------+---+
| 2
|  
   |  
|
+---+------+---+
1 row
in set
(0.00
sec)
mysql> select * from testaa where  b
is null;
+---+------+---+
| a
| b  
 | c |
+---+------+---+
| 3
| NULL
|   |
| 4
| NULL
|   |
+---+------+---+
 
mysql>
select length(b),length(c) from testaa;
+-----------+-----------+
| length(b) |
length(c)
|
+-----------+-----------+
| 2 | 0 |
| 0 | 0 |
| NULL
| 0 |
| NULL
| 0 |
| 4 | 2 |
+-----------+-----------+
5 rows
in set
(0.00
sec)
 
 
mysql>
select count(b),count(c) from testaa;
+----------+----------+
| count(b) |
count(c)
|
+----------+----------+
| 3 | 5 |
+----------+----------+
1 row
in set
(0.00
sec)
 
mysql>
create table testbb ( a int primary key , b timestamp);
Query OK, 0 rows affected (0.07 sec)
mysql>
show create table testbb;
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table
| Create
Table |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| testbb
| CREATE TABLE
`testbb` (
`a` int(11) NOT
NULL,
`b` timestamp NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT
CHARSET=utf8 |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

 
mysql>
insert into
testbb vales (1,null) ;
mysql>
insert into
testbb values (2,'');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql>
show warnings;
+---------+------+----------------------------------------+

| Level
| Code
| Message
|
+---------+------+----------------------------------------+

| Warning
| 1265
| Data
truncated for
column 'b'
at row 1
|
+---------+------+----------------------------------------+

mysql>
select *
from testbb;
+---+---------------------+
| a | b |
+---+---------------------+
| 1 | 2014-08-15 14:32:10 |
| 2 | 0000-00-00 00:00:00 |
+---+---------------------+
2 rows
in set
(0.00
sec)
 
 
注意事项:
1:在进行count()统计某列的记录数的时候,如果采用的NULL值,会别系统自动忽略掉,但是空值是会进行统计到其中的。
2:
判断NULL
用IS NULL
或者 is
not null,SQL 语句函数中可以使用ifnull()函数来进行处理,判断空字符用
=''或者 <>''来进行处理
3:
对于MySQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插入的列插入NULL值,则出现的值是当前系统时间。插入空值,则会出现
'0000-00-00
00:00:00'
4:对于空值的判断到底是使用is null 还是 =''要根据实际业务来进行区分。
 
 
 

除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。这看起来好像有点争议,请往下看。

首先,我们要搞清楚“空值” 和 “NULL” 的概念:
1、空值是不占用空间的
2、MySQL中的NULL其实是占用空间的

所谓的NULL就是什么都没有,连\0都没有,\0在字符串中是结束符,但是在物理内存是占空间的,等于一个字节,而NULL就是连这一个字节都没
有。在数据库里是严格区分的,任何数跟NULL进行运算都是NULL, 判断值是否等于NULL,不能简单用=,而要用IS NULL关键字。

数据库的字段ID设为NOT NULL, 仅仅说明该字段不能为NULL, 也就是说只有在
INSERT INTO table(ID) VALUES(NULL);
这种情况下数据库会报错,而
INSERT INTO table(ID) VALUES( ‘ ‘);
这不能说明是NULL, 数据库系统会根据ID设的缺省值填充,或者如果是自增字段就自动加一等缺省操作。

尽量避免NULL:应该指定列为NOT
NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,而且对表索引时不会存储NULL值的,所以如果索引的字段可以为
NULL,索引的效率会下降很多。因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

 

MySQL 中NULL和空值的区别 (转载 http://blog.sina.com.cn/s/blog_3f2a82610102v4dn.html)的更多相关文章

  1. MySQL 中NULL和空值的区别,索引列可以有空值或者null吗?

    空值跟null的区别.mysql官方: “NULL columns require additional space in the row to record whether their values ...

  2. 【面试】MySQL 中NULL和空值的区别?

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 01 小木的故事 作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值.那 ...

  3. MySQL 中NULL和空值的区别

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

  4. quartus ii13.0~16.0 调用uedit (转载http://blog.sina.com.cn/s/blog_6d5560f00102vax6.html)

    转自 http://blog.sina.com.cn/s/blog_6d5560f00102vax6.html Quartus II 中的文本编辑软件不好用,比较习惯与UE(Uedit32/ultra ...

  5. mysql中null与“空值”的坑

    https://blog.csdn.net/u014743697/article/details/54136092

  6. GnuDIP制作动态域名服务器(DDNS Server)_转载http://blog.sina.com.cn/s/blog_4d4c23530100rlfj.html

    这个阶段在做DDNS,虽然有dyndns和tzo两个免费的国外的DDNS服务器(支持免费用户注册使用),但是公司需求中要有GnuDIP这种服务.于是只能自己制作DDNS服务器,颇费功夫,于是想把这段记 ...

  7. nginx、fastCGI、php-fpm关系梳理(转载 http://blog.sina.com.cn/s/blog_6df9fbe30102v57y.html)

        前言: Linux下搭建nginx+php+memached(LPMN)的时候,nginx.conf中配需要配置fastCGI,php需要安装 php-fpm扩展并启动php-fpm守护进程, ...

  8. 基本滤波算法比较 (转载http://blog.sina.com.cn/s/blog_69f2aa5a01014du5.html)

    最近在做关于数据采集方面的东西,这就不免涉及到了滤波的算法,在网上找到了关于几种算法的比较. 数字滤波方法有很多种,每种方法有其不同的特点和使用范围.从大的范围可分为3类. 1.克服大脉冲干扰的数字滤 ...

  9. EFDC主控文件efdc.inp文件的xml格式化处理——转载http://blog.sina.com.cn/s/articlelist_1584892573_0_1.html

    在对EFDC模型进行系统集成时,虽然可以通过一行一行读来进行解析处理,但那将是一个繁琐的工作.我们经过xml格式化处理后,再经xsd转成Dataset类对象,那么整个主控文件就是一个数据库表集合,对其 ...

随机推荐

  1. GCD的简单介绍

    一)GCD 的使用方式 dispatch_async(dispatch_queue_t queue, dispatch_block_t block); async表明运行方式 queue则是你把任务交 ...

  2. zepto源码--compact、flatten、camelize、dasherize、uniq--学习笔记

    1.compact 删除数组中的空元素(不是空字符串).undefined.null 在定义变量时,定义过filter = emptyArray.filter,即调用javascript原生的数组处理 ...

  3. php--yii2框架错误提示

    if($code!=200){ $user=new UserAuth(); $user->mobile=$register['mobile']; $user->password=md5($ ...

  4. ADO.NET中主要对象

    ADO.NET是什么? ADO.NET是.Net平台提供和数据库交互的类库集,我们可以通过它对SQLSERVER,XML,Oracle等这样的数据源进行访问. 应用程序可以使用ADO.NET链接到数据 ...

  5. documentElement和ownerDocument和ownerElement

    1.document.documentElement是指文档根节点----HTML元素 2.element.ownerDocument是指当前元素所在的文档对象----document 3.attrO ...

  6. JMeter学习-008-JMeter 后置处理器实例之 - 正则表达式提取器(一)概述及简单实例

    上文我们讲述了如何对 HTTP请求 的响应数据进行断言,以判断响应是否符合我们的预期,敬请参阅:JMeter学习-007-JMeter 断言实例之一 - 响应断言 那么我们如何获取 HTTP请求 响应 ...

  7. MySQL管理之道:性能调优、高可用与监控内置脚本

    MySQL管理之道:性能调优.高可用与监控内置脚本 随书附送脚本 keepalive配置文件和脚本开源工具pssh批量管理服务器(python) 下载地址 http://files.cnblogs.c ...

  8. BI如何让企业管理从信息化迈向智能化 ——暨珠海CIO协会成立大会圆满召开

    2016年8月27日,珠海CIO协会成立大会在珠海度假村酒店成功举办.此次会议由奥威软件等数家公司共同协办.珠海市信息协会秘书长周德元先生.广东省首席信息官协会秘书长周庆林先生.珠海市首席信息官协会会 ...

  9. Centos php项目发布问题

    LAMP环境,项目运行错误日志路径:/var/log/httpd 错误日志例如: [Sat Jul :: ] [error] [client , referer: http://192.168.100 ...

  10. matlab将多条曲线绘制在一起

    figure; hold on; : plot(x(i,:),y(i,:)); end x=:*pi); hold on : y=sin(x+i*pi/)+exp(x/); plot(x,y, -(] ...