mysql ‘’ 和null区别

来源:互联网 发布:华为云计算部门年终奖 编辑:程序博客网 时间:2024/04/28 06:02
平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解。注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOTNULL 来避免这种低效率的事情的发生。
   问题 1: 首先,我们需要搞清楚 "空值"和"NULL"的概念:
    1:空值('')是不占用空间的
    2:MySQL中的NULL其实是占用空间的。官方文档说明:
“NULL columns require additional spacein the row to record whether their values are NULL. For MyISAMtables, each NULL column takes one bit extra, rounded up to thenearest 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 notnull,2个查询语句有啥不同。
eg:
mysql> show create table testaa;
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | CreateTable                                                                                                                              |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| testaa| CREATE TABLE`testaa`(
  `a` int(11)NOT NULL,
  `b` varchar(20)DEFAULT NULL,
  `c` varchar(20)NOT NULL,
  PRIMARY KEY(`a`)
) ENGINE=InnoDB DEFAULTCHARSET=utf8;

插入测试数据:
mysql>insert testaa  values(1,'aa','');
Query OK, 1 row affected(0.00sec)
mysql>insert testaa  values(2,'','');
Query OK, 1 row affected(0.00sec)
mysql>insert testaa  values(3,null,'');
Query OK, 1 row affected(0.00sec)
mysql>insert testaa  values(4,NULL,'');
Query OK, 1 row affected(0.00sec)
mysql>insert testaa  values(5,'aafa','fa');
Query OK, 1 row affected(0.00sec)

mysql>insert testaa values (6,'',NULL);
ERROR 1048(23000):Column'c'cannot be null

mysql>select *fromtestaa;
+---+------+----+
| a| b   |c  |
+---+------+----+
| 1| aa  |   |
| 2|     |  |
| 3| NULL|   |
| 4| NULL|   |
| 5| aafa| fa |
+---+------+----+

查询验证过程:

mysql>select *fromtestaawherecisnotnull;
+---+------+----+
| a| b   |c  |
+---+------+----+
| 1| aa  |   |
| 2|     |  |
| 3| NULL|   |
| 4| NULL|   |
| 5| aafa| fa |
+---+------+----+
5 rowsin set(0.00sec)

mysql>select *fromtestaawherec<>'';
+---+------+----+
| a| b   |c  |
+---+------+----+
| 5| aafa| fa |
+---+------+----+
1 rowin set(0.00sec)
mysql>select *fromtestaa wherec='';
+---+------+---+
| a| b   |c|
+---+------+---+
| 1| aa  | |
| 2|     | |
| 3| NULL|   |
| 4| NULL|   |
+---+------+---+
4 rowsin set(0.00sec) 

mysql> select*fromtestaa where  cisnull;
Emptyset (0.00sec)


mysql>select *fromtestaawherebisnotnull;
+---+------+----+
| a| b   |c  |
+---+------+----+
| 1| aa  |   |
| 2|     |  |
| 5| aafa| fa |
+---+------+----+
3 rowsin set(0.00sec)

mysql>select *fromtestaawhereb<>'';
+---+------+----+
| a| b   |c  |
+---+------+----+
| 1| aa  |   |
| 5| aafa| fa |
+---+------+----+
2 rowsin set(0.00sec)

mysql>select *fromtestaawhereb='';
+---+------+---+
| a| b   |c|
+---+------+---+
| 2|     | |
+---+------+---+
1 rowin set(0.00sec)
mysql> select*fromtestaa where  bisnull;
+---+------+---+
| a| b   |c|
+---+------+---+
| 3| NULL|   |
| 4| NULL|   |
+---+------+---+

mysql>select length(b),length(c)fromtestaa;
+-----------+-----------+
| length(b) |length(c)|
+-----------+-----------+
| 2 | 0 |
| 0 | 0 |
| NULL| 0 |
| NULL| 0 |
| 4 | 2 |
+-----------+-----------+
5 rowsin set(0.00sec)


mysql>select count(b),count(c)fromtestaa;
+----------+----------+
| count(b) |count(c)|
+----------+----------+
| 3 | 5 |
+----------+----------+
1 rowin set(0.00sec)

mysql>create table testbb (aintprimary key , b timestamp);
Query OK, 0 rows affected(0.07sec)
mysql>show create table testbb;
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table| CreateTable|
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| testbb| CREATE TABLE`testbb`(
`a` int(11) NOTNULL,
`b` timestamp NOT NULLDEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULTCHARSET=utf8|
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

mysql>insert intotestbb vales(1,null);
mysql>insert intotestbb values(2,'');
Query OK, 1 row affected,1warning(0.00 sec)
mysql>show warnings;
+---------+------+----------------------------------------+
| Level| Code| Message|
+---------+------+----------------------------------------+
| Warning| 1265|Datatruncatedforcolumn'b'at row 1|
+---------+------+----------------------------------------+
mysql>select *fromtestbb;
+---+---------------------+
| a | b |
+---+---------------------+
| 1 | 2014-08-1514:32:10|
| 2 | 0000-00-0000:00:00|
+---+---------------------+
2 rowsin set(0.00sec)


注意事项:
1:在进行count()统计某列的记录数的时候,如果采用的NULL值,会别系统自动忽略掉,但是空值是会进行统计到其中的。
2判断NULLIS NULL或者isnotnull,SQL语句函数中可以使用ifnull()函数来进行处理,判断空字符用=''或者<>''来进行处理

3:对于MySQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插入的列插入NULL值,则出现的值是当前系统时间。插入空值,则会出现'0000-00

4 mysql可视化编辑区中,空指的是NULL,勾选空表示该字段允许为空,那么他的默认值是NULL,如果某字段不勾选空,表示该字段的值不为空,那么该字段的值就不能插入NULL










0 0
原创粉丝点击