mysql的空字符串_MySQL中NULL与空字符串

2022-05-13 12:15:02

一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串’  ’是相同的。这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的。NULL是指没有值,而”则表示值是存在的,只不过是个空值。对于SQL的新手,NULL值的概念常常会造成混淆,他们常认为NULL与MySQL空字符串是相同的事。情况并非如此。例如,下述语句是完全不同的:MySQL> INSERT INTO my_table (phone) VALUES (NULL);

mysql> INSERT INTO my_table (phone) VALUES ('');

这两条语句均会将值插入phone(电话)列,但第1条语句插入的是NULL值,第2条语句插入的是空字符串。第1种情况的含义可被解释为“电话号码未知”,而第2种情况的含义可被解释为“该人员没有电话,因此没有电话号码”。

为了进行NULL处理,可使用IS NULL和IS NOT NULL操作符以及IFNULL()函数。

对于聚合(累计)函数,如COUNT()、MIN()和SUM(),将忽略NULL值。对此的例外是COUNT(*),它将计数行而不是单独的列值。例如,下述语句产生两个计数。首先计数表中的行数,其次计数age列中的非NULL值数目:mysql> SELECT COUNT(*), COUNT(age) FROM person;

对于某些列类型,MySQL将对NULL值进行特殊处理。如果将NULL插入TIMESTAMP列,将插入当前日期和时间。如果将NULL插入具有AUTO_INCREMENT属性的整数列,将插入序列中的下一个编号。另外''可以走索引,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。

  • 作者:歹小悦
  • 原文链接:https://blog.csdn.net/weixin_28756413/article/details/113195607
    更新时间:2022-05-13 12:15:02