Mysql 中null与空字符串 区别

前阵子在更新数据库时候碰见一个新增表的语句,发现插入的空值自动填充的值,很是费解,下面我们先来说说案例,以下是模仿的测试:

首先创建一个表:create table ceshi(ID INT ,createDate TimesTamp );

包含2个字段,idint类型,createDateTimesTamp类型,现在往这个表中插入一条数据,其中createDate类型插入一个空值null

语句: insert into ceshi values(001,null);

 

mysql> insert into ceshi values(001,null);

Query OK, 1 row affected (0.01 sec)

插入成功了,现在来查询下这个表中的记录,查看结果如下:

[sql]  view plain copy
  1. mysql> select * from ceshi;  
  2.   
  3. +------+---------------------+  
  4.   
  5. | ID   | createDate          |  
  6.   
  7. +------+---------------------+  
  8.   
  9. |    1 | 2012-10-08 06:12:34 |  
  10.   
  11. +------+---------------------+  
  12.   
  13. 1 row in set (0.01 sec)  


我明明插入的是一条空值null,为什么在显示的时候是显示系统当前时间呢?那再试试直接插入空字符串呢?

 

[sql]  view plain copy
  1. mysql> insert into ceshi values(002,'');    
  2.   
  3. Query OK, 1 row affected, 1 warning (0.00 sec)  
  4.   
  5.   
  6. mysql> select * from ceshi;               
  7.   
  8. +------+---------------------+  
  9.   
  10. | ID   | createDate          |  
  11.   
  12. +------+---------------------+  
  13.   
  14. |    1 | 2012-10-08 06:12:34 |  
  15.   
  16. |    2 | 0000-00-00 00:00:00 |  
  17.   
  18. +------+---------------------+  
  19.   
  20. rows in set (0.00 sec)  


显示的不是系统当前时间,而是0000-00-00 00:00:00

那如果字段不是时间类型而是varchar类型,结果又会不会也是一样呢,更改表结构,增加字段name varchar(10),同时插入一条数据:

[sql]  view plain copy
  1. mysql> insert into ceshi values(003,null,null);  
  2.   
  3. Query OK, 1 row affected (0.01 sec)  
  4.   
  5.   
  6. mysql> select * from ceshi;                      
  7.   
  8. +------+---------------------+------+  
  9.   
  10. | ID   | createDate          | name |  
  11.   
  12. +------+---------------------+------+  
  13.   
  14. |    1 | 2012-10-08 06:12:34 | NULL |  
  15.   
  16. |    2 | 0000-00-00 00:00:00 | NULL |  
  17.   
  18. |    3 | 2012-10-08 06:22:12 | NULL |  
  19.   
  20. +------+---------------------+------+  
  21.   
  22. rows in set (0.00 sec)  


增加了null值,再往字段中插入''空字符串:

[sql]  view plain copy
  1. mysql> insert into ceshi(namevalues('');  
  2.   
  3. Query OK, 1 row affected (0.01 sec)  
  4.   
  5.   
  6. mysql> select * from ceshi;                 
  7.   
  8. +------+---------------------+------+  
  9.   
  10. | ID   | createDate          | name |  
  11.   
  12. +------+---------------------+------+  
  13.   
  14. |    1 | 2012-10-08 06:12:34 | NULL |  
  15.   
  16. |    2 | 0000-00-00 00:00:00 | NULL |  
  17.   
  18. |    3 | 2012-10-08 06:22:12 | NULL |  
  19.   
  20. NULL | 2012-10-08 06:23:01 |      |  
  21.   
  22. +------+---------------------+------+  
  23.   
  24. rows in set (0.01 sec)  


看着好似插入的都没有问题,但是我们去统计name的数据量时候,这个时候又有问题了:

[sql]  view plain copy
  1. mysql> select count(namefrom ceshi;  
  2.   
  3. +-------------+  
  4.   
  5. count(name) |  
  6.   
  7. +-------------+  
  8.   
  9. |           1 |  
  10.   
  11. +-------------+  
  12.   
  13. 1 row in set (0.00 sec)  


 

结果只有一条,就是说,count函数把null(空值)给忽略掉了,而只统计出name=''的数据。

所以对于这样的语句即使是查询时候,采用null值过滤最好是使用is null 或者is not null 来作为条件。

综上:原来null(空值)不一定就等于''空字符,null(空值)也不一定为空。

解释为:在前面的那个createDate 字段插入null值的时候,在mysql数据库中,NULL对于一些特殊类型的列来说,其代表了一种特殊的含义,而不仅仅是一个空值。对于这些特殊类型的列, 一个是TimesTamp 类型,另外就是自增长列,而对于其它类型,插入null时候就显示的是null值。另外在第二次测试createDate 插入空字符串的时候显示0000-00-00 00:00:00,是由于mysql的非严格模式,对于输入的不合法给自动转换了,并给出警告。

而对于count统计函数,会自动忽略掉null值。于是想,为什么要这样做呢,原来这样也是有好处的,假如统计某个区域有手机号码的用户信息,我们只要使用count(手机号码)就可以自动过滤掉没有手机的人。

 

你可能感兴趣的:(Mysql 中null与空字符串 区别)