理解:MySQL的null与空字符串的不同

MySQL的null与空字符串:

搞过Oracle的人,常常会对MySQL的null与空字符串''搞错。
在Oracle里:null 与 ''是等价的。

15:02:40 sql>create table test(v varchar2(10));
15:02:46 sql>insert into test values('');
15:03:07 sql>insert into test values(null);
15:03:12 sql>commit;
15:04:05 sql>select count(1) from test where v is null;
 COUNT(1)
----------
         2
15:04:07 sql>select count(1) from test where v ='';
  COUNT(1)
----------
         0  

15:04:41 sql>select count(1) from test where v <>'';
  COUNT(1)
----------
         0        
注意:Oracle中null仅只能参与is null 和 is not null运算。如何使用 <> 、= 与null进行比较,都会返回false。        

但在MySQL里,null与 ''是完全不同的:NULL是指没有值,而''则表示值是存在的,只不过是个空值。

见如下实验:
mysql> create table test (v varchar(10));
ERROR 1050 (42S01): Table 'test' already exists
mysql> drop table test;
Query OK, 0 rows affected (0.11 sec)

mysql> create table test (v varchar(10));
Query OK, 0 rows affected (0.11 sec)

mysql> insert into test values(null);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test values('');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+
| v    |
+------+
| NULL |
|      |
+------+
2 rows in set (0.00 sec)

mysql> select count(1) from test where v is null;
+----------+
| count(1) |
+----------+
|        1 |
+----------+
1 row in set (0.04 sec)

mysql> select count(1) from test where v = '';
+----------+
| count(1) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)


再看看MySQL在时间类型字段上是如何处理null与''

mysql> create table t_date (d timestamp);
ERROR 1050 (42S01): Table 't_date' already exists
mysql> drop table t_date;
Query OK, 0 rows affected (0.12 sec)

mysql> create table t_date (d timestamp ,d2 datetime);
Query OK, 0 rows affected (0.14 sec)

mysql> insert into t_date values(null,null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_date;
+---------------------+------+
| d                   | d2   |
+---------------------+------+
| 2014-02-19 15:42:11 | NULL |
+---------------------+------+
1 row in set (0.00 sec)

注:timestamp类型插入null,却插入了系统当前时间

mysql> desc t_date;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| d     | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| d2    | datetime  | YES  |     | NULL              |                             |
+-------+-----------+------+-----+-------------------+-----------------------------+

原来MySQL给自动给timestamp类型增加了默认值而不能为null。

mysql> insert into t_date (d) values ('');
ERROR 1292 (22007): Incorrect datetime value: '' for column 'd' at row 1
mysql> insert into t_date (d2) values ('');
ERROR 1292 (22007): Incorrect datetime value: '' for column 'd2' at row 1
时间字段不能插入''。

mysql> select @@version;
+------------------+
| @@version        |
+------------------+
| 5.6.14-ndb-7.3.3 |
+------------------+
1 row in set (0.00 sec)

不同版本的MySQL对时间字段的处理不一样,有的版本会把''转换为'0000-00-00 00:00:00'插入到表中。

而且相同版本不同的命令也可能不一样。

在我的实验中,使用load data 导入文本文件时,就发生了''转换为'0000-00-00 00:00:00'保存到表中。

附:
  使用load data进行导入数据的时候,没有数据的字段插入的不是null,而是'';为了能插入null,在文本文件中使用'\N'来代表null。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/195110/viewspace-1084061/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/195110/viewspace-1084061/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值