1.以oracle为例
SQL> create table test(id int primary key,content varchar(20));
SQL> INSERT INTO test (id, content) VALUES (1, NULL);
SQL> INSERT INTO test (id, content) VALUES (2, '');
SQL> INSERT INTO test (id, content) VALUES (3, ' ');
SQL> INSERT INTO test (id, content) VALUES (4, 'x');
SQL> select * from test;
ID CONTENT
---------- --------------------
1
2
3
4 x
SQL> SELECT ID,CONTENT,
case when content is null then 1 else 0 end as isnull,
case when content = '' then 1 else 0 end as isempty,
case when content = ' ' then 1 else 0 end as blank
from
test;
ID CONTENT ISNULL ISEMPTY BLANK
---------- -------------- ---------- ---------- ----------
1 1 0 0
2 1 0 0
3 0 0 1
4 x 0 0 0
SQL> select id,content,length(content) from test;
ID CONTENT LENGTH(CONTENT)
---------- -------------------- ---------------
1
2
3 1
4 x 1
SQL>
从结果可以看到,empry string被插入表中时,被当做NULL对待。因此,empty strings不会在数据库中存储。 单个空格是不会被转换的,因为不是一个empty string。
2.以mysql为例
>create table test(id int primary key,content varchar(20));
>INSERT INTO test (id, content) VALUES (1, NULL);
>INSERT INTO test (id, content) VALUES (2, '');
>INSERT INTO test (id, content) VALUES (3, ' ');
>INSERT INTO test (id, content) VALUES (4, 'x');
>select * from test;
+----+---------+
| id | content |
+----+---------+
| 1 | NULL |
| 2 | |
| 3 | |
| 4 | x |
+----+---------+
4 rows in set (0.00 sec)
>SELECT ID,CONTENT,
case when content is null then 1 else 0 end as isnull,
case when content = '' then 1 else 0 end as isempty,
case when content = ' ' then 1 else 0 end as blank
from
test;
+----+---------+--------+---------+-------+
| ID | CONTENT | isnull | isempty | blank |
+----+---------+--------+---------+-------+
| 1 | NULL | 1 | 0 | 0 |
| 2 | | 0 | 1 | 1 |
| 3 | | 0 | 1 | 1 |
| 4 | x | 0 | 0 | 0 |
+----+---------+--------+---------+-------+
4 rows in set (0.00 sec)
>select id,content,length(content) from test;
+----+---------+-----------------+
| id | content | length(content) |
+----+---------+-----------------+
| 1 | NULL | NULL |
| 2 | | 0 |
| 3 | | 1 |
| 4 | x | 1 |
+----+---------+-----------------+
可以看到NULL和empty string是不同的。而empty string和空格string被认为是相同的,但是在计算长度的时候却又不同了。
3.以pg为例
postgres=# create table test(id int primary key,content varchar(20));
postgres=# INSERT INTO test (id, content) VALUES (1, NULL);
postgres=# INSERT INTO test (id, content) VALUES (2, '');
postgres=# INSERT INTO test (id, content) VALUES (3, ' ');
postgres=# INSERT INTO test (id, content) VALUES (4, 'x');
postgres=# select * from test;
id | content
----+---------
1 |
2 |
3 |
4 | x
(4 rows)
postgres=# SELECT ID,CONTENT,
case when content is null then 1 else 0 end as isnull,
case when content = '' then 1 else 0 end as isempty,
case when content = ' ' then 1 else 0 end as blank
from test;
id | content | isnull | isempty | blank
----+---------+--------+---------+-------
1 | | 1 | 0 | 0
2 | | 0 | 1 | 0
3 | | 0 | 0 | 1
4 | x | 0 | 0 | 0
(4 rows)
postgres=# select id,content,length(content) from test;
id | content | length
----+---------+--------
1 | |
2 | | 0
3 | | 1
4 | x | 1
(4 rows)
postgres=#
看前两行,NULL被插入后仍被当做NULL,不能当做empty string。从第二行可以看到,插入的empty string没有被当做NULL,仍然是一个empty string。
NULLs和non-NULLs
(1)oracle数据库
SQL> SELECT id, content,
content || NULL AS concatnull,
content || 'x' AS concatchar
FROM test;
ID CONTENT CONCATNULL CONCATCHAR
---------- -------------------- -------------------- ---------------------
1 x
2 x
3 x
4 x x xx
SQL>
在oracle中,NULLs和字符相连接后,输出结果是字符。
(2)mysql数据库
>SELECT id, content,
content || NULL AS concatnull,
content || 'x' AS concatchar
FROM test;
+----+---------+------------+------------+
| id | content | concatnull | concatchar |
+----+---------+------------+------------+
| 1 | NULL | NULL | NULL |
| 2 | | NULL | 0 |
| 3 | | NULL | 0 |
| 4 | x | NULL | 0 |
+----+---------+------------+------------+
mysql中可以用concat拼接多个,但用||无法拼接字符串,会显示零。
>SELECT id, content,
concat(content,NULL) AS concatnull,
concat(content,'x') AS concatchar
FROM test;
+----+---------+------------+------------+
| id | content | concatnull | concatchar |
+----+---------+------------+------------+
| 1 | NULL | NULL | NULL |
| 2 | | NULL | x |
| 3 | | NULL | x |
| 4 | x | NULL | xx |
+----+---------+------------+------------+
NULL和non-NULLS拼接结果是NULL
(3)pg数据库
postgres=# SELECT id, content,
postgres-# content || NULL AS concatnull,
postgres-# content || 'x' AS concatchar
postgres-# FROM test;
id | content | concatnull | concatchar
----+---------+------------+------------
1 | | |
2 | | | x
3 | | | x
4 | x | | xx
(4 rows)
postgres=#
在pg中,NULLs和字符相连接后,NULL出现在任何一个值中都意味着结果是NULL作为输出值,而不管它连接的是什么。