`

MySQL 中NULL和空值的区别

阅读更多
平时我们在使用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 还是 =''要根据实际业务来进行区分。

转自:http://blog.sina.com.cn/s/blog_3f2a82610102v4dn.html
分享到:
评论

相关推荐

    Oracle Mysql GBase数据库NULL值与空值行为测试.pdf

    3. 在查询语句中,Oracle和GBase对空值与NULL值无明显区分,而MySQL区分对待。 4. 创建唯一索引时,Oracle视不同NULL值为不相等,GBase不允许存在多个NULL值,而MySQL仅对varchar字段不允许创建唯一索引,因为空值...

    MySQL null与not null和null与空值的区别详解

    MySQL数据库在设计表结构时,`NULL` 和 `NOT NULL` 是两个重要的字段约束,它们在数据存储和查询中有着显著的区别。理解这些差异对于优化数据库性能和编写正确的SQL语句至关重要。 首先,我们需要明确“空值”和...

    详解MySQL中的NULL值

    在MySQL数据库中,`NULL`值是一个特殊的存在,表示数据未知或者不存在。处理`NULL`值时,需要注意一些特定的规则和操作符。本篇文章将深入解析MySQL中的`NULL`值及其相关的查询方法。 首先,当尝试使用`= NULL`或`!...

    区分MySQL中的空值(null)和空字符()

    日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到Mysql中的NULL和空字符。 空字符(”)和空值(null)表面上看都是空,其实存在一些差异: 定义: 空值(NULL)的长度是NULL,不确定占用了多少存储...

    MySQL数据库:空值比较.pptx

    MySQL有一个特殊的等于运算符“”,当两个表达式彼此相等或都等于空值时,它的值为TRUE,其中有一个空值或都是非空值但不相等,这个条件就是FALSE。 【例】 查询Sell表中还未收货的订单情况。 SELECT * FROM Sell ...

    NOT NULL 和NULL

    如果既不指定NULL也不指定NOT NULL,列被认为指定了NULL 在 MySQL 中, 为一个 NOT NULL 字段设置 NULL 值 , 它并不会出错, MySQL 会自动将 NULL值转化为该字段的默认值, 那怕是你在表定义时没有...

    MySQL NULL 值处理实例详解

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

    mysql 转换NULL数据方法(必看)

    使用mysql查询数据库,当执行left join时,有些关联的字段内容是NULL,因此获取记录集后,需要对NULL的数据进行转换操作。 本文将提供一种方法,可以在查询时直接执行转换处理。使获取到的记录集不需要再进行转换。 ...

    oracle和MySQL区别手册

    `NULL`和空字符串在MySQL中的处理方式有所不同,例如使用`IS NULL`进行判断时,两者的返回结果是不同的。 #### 基本语法使用 - **日期时间函数格式**: - **Oracle**: 默认的时间格式为`yyyy-MM-dd hh:mi:ss`。 -...

    如何将数据库中的NUll写入到数据库中去

    例如,整型和日期时间类型通常不允许NULL,除非明确声明为允许NULL的(如MySQL的NOT NULL DEFAULT NULL)。在创建表时,要确保允许NULL的列使用了正确的数据类型。 6. NULL vs. 空字符串: 值得注意的是,NULL和空...

    详解mysql不等于null和等于null的写法

    在SQL语言中,`NULL`是一个特殊的值,它表示未知或者未定义。处理`NULL`值时,需要注意其与...在MySQL中,使用`IS NULL`和`IS NOT NULL`来处理`NULL`值,同时了解相关的函数和约束,能帮助我们更有效地管理和操作数据。

    datax抽取数据到hdfs的null值变成''(引号)的问题

    mysql的null值通过datax抽取到hdfs,会变成引号,这不是我们所需要的,所以需要修改一下datax的源码

    MySQL中可为空的字段设置为NULL还是NOT NULL

    在MySQL数据库中,字段的可为空性是一个重要的设计决策,主要涉及到`NULL`和`NOT NULL`两种约束。这两种约束不仅影响数据的存储方式,还直接影响到查询性能和数据的一致性。 首先,理解`NULL`和“空值”的概念至关...

    小心陷阱!MySQL中处理Null时需注意两点

    在MySQL数据库中,在不同的情形下,空值往往代表不同的含义。这是MySQL数据库的一种特性。如在普通的字段中(字符型的数据),空值就是表示空值。但是如果将一个空值的数据插入到TimesTamp类型的字段中,空值就不一定...

    Mysql NULL导致的神坑

    本篇文章将深入探讨MySQL中`NULL`值与比较运算符之间的交互及其可能带来的问题。 1. **NULL与任何比较运算符的结果** 当我们尝试用比较运算符(如`&gt;`、`、`&gt;=`、`、`=`、`&lt;&gt;`或`!=`)来比较`NULL`值时,结果并不会...

    MySQL操作手册v1.0.pdf

    手册中首先提到了Linux平台下的MySQL安装方法,包括Ubuntu和CentOS两种主流Linux发行版的安装命令,并提到了配置文件目录的所在位置。接着,手册详细介绍了密码的修改过程,以及登录MySQL服务器的方法,强调了在...

    MySQL SQL高级特性 字段约束-索引-视图-外键学习实践

    在本部分内容中,重点介绍了NULL和NOT NULL修饰符的使用和区别。在MySQL中,NULL意味着该字段可以没有值,即空值;而NOT NULL修饰的字段则必须在插入记录时给出值,不能为NULL。对于NOT NULL字段的效率之所以比NULL...

    MySQL 字段约束 mysql学习笔记

    今天我们来看一下 MySQL 的字段约束:NULL 和 NOT NULL 修饰符、DEFAULT 修饰符、AUTO_INCREMENT 修饰符。 NULL 和 NOT NULL 修饰符 NULL 和 NOT NULL 修饰符可以在每个字段后面添加,以指定该字段是否可以为空...

    MySQL非空约束(not null)案例讲解.doc

    MySQL 非空约束(NOT NULL)案例讲解 MySQL 非空约束(NOT NULL)是指字段的值不能为空,这种约束可以在创建表时或修改表时添加。非空约束的作用是确保字段的值不能为空,否则数据库系统就会报错。 创建表时设置...

Global site tag (gtag.js) - Google Analytics