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)

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

mysql> select * from ceshi;

+------+---------------------+

| ID   | createDate          |

+------+---------------------+

|    1 | 2012-10-08 06:12:34 |

+------+---------------------+

1 row in set (0.01 sec)


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

 

mysql> insert into ceshi values(002,'');  

Query OK, 1 row affected, 1 warning (0.00 sec)


mysql> select * from ceshi;             

+------+---------------------+

| ID   | createDate          |

+------+---------------------+

|    1 | 2012-10-08 06:12:34 |

|    2 | 0000-00-00 00:00:00 |

+------+---------------------+

2 rows in set (0.00 sec)


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

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

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

Query OK, 1 row affected (0.01 sec)


mysql> select * from ceshi;                    

+------+---------------------+------+

| ID   | createDate          | name |

+------+---------------------+------+

|    1 | 2012-10-08 06:12:34 | NULL |

|    2 | 0000-00-00 00:00:00 | NULL |

|    3 | 2012-10-08 06:22:12 | NULL |

+------+---------------------+------+

3 rows in set (0.00 sec)


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

mysql> insert into ceshi(name) values('');

Query OK, 1 row affected (0.01 sec)


mysql> select * from ceshi;               

+------+---------------------+------+

| ID   | createDate          | name |

+------+---------------------+------+

|    1 | 2012-10-08 06:12:34 | NULL |

|    2 | 0000-00-00 00:00:00 | NULL |

|    3 | 2012-10-08 06:22:12 | NULL |

| NULL | 2012-10-08 06:23:01 |      |

+------+---------------------+------+

4 rows in set (0.01 sec)


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

mysql> select count(name) from ceshi;

+-------------+

| count(name) |

+-------------+

|           1 |

+-------------+

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(手机号码)就可以自动过滤掉没有手机的人。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值