前阵子在更新数据库时候碰见一个新增表的语句,发现插入的空值自动填充的值,很是费解,下面我们先来说说案例,以下是模仿的测试:
首先创建一个表:create table ceshi(ID INT ,createDate TimesTamp );
包含2个字段,id为int类型,createDate为TimesTamp类型,现在往这个表中插入一条数据,其中createDate类型插入一个空值null;
语句: insert into ceshi values(001,null);
mysql> insert into ceshi values(001,null);
Query OK, 1 row affected (0.01 sec)
插入成功了,现在来查询下这个表中的记录,查看结果如下:
我明明插入的是一条空值null,为什么在显示的时候是显示系统当前时间呢?那再试试直接插入空字符串呢?
显示的不是系统当前时间,而是0000-00-00 00:00:00。
那如果字段不是时间类型而是varchar类型,结果又会不会也是一样呢,更改表结构,增加字段name varchar(10),同时插入一条数据:
增加了null值,再往字段中插入''空字符串:
看着好似插入的都没有问题,但是我们去统计name的数据量时候,这个时候又有问题了:
结果只有一条,就是说,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(手机号码)就可以自动过滤掉没有手机的人。