MYSQL中NULL空值與空字符串區別詳解及代碼
NULL
是指沒有值
而''
則表示值是存在的,只不過是長度為零
下面我們實際建立一個表來進行測試和區分。
CREATE TABLE `tb_test` (
`name` varchar(255) DEFAULT NULL,
`value` varchar(255) DEFAULT NULL,
`test` char(0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入表中幾條數據:
insert into tb_test values('t1',null,null); ##創建一條value為空的數據
insert into tb_test values('t2','',''); ##創建一條為空字符的數據
insert into tb_test values('t2','111','');
insert into tb_test values('t2','111',null);
- 對NULL的判斷
select * from tb_test where value is null;
select * from tb_test where ISNULL(value);
查詢結果:
select * from tb_test where value is not null;
select * from tb_test where ISNULL(value)=0;
查詢結果均為:
- 對空字符串的判斷
select * from tb_test where LENGTH(value)=0;
select * from tb_test where value='';
查詢結果均為:
select * from tb_test where LENGTH(test)=0;
select * from tb_test where test='';
查詢結果均為:
- 同時剔除null 和空字符串
select * from tb_test
where ISNULL(value)=0 and LENGTH(trim(value))>0;
select * from tb_test where value is not null and value <>'';
查詢結果均為:
- 對NULL的替換
select name,IFNULL(value,'我是NULL') from tb_test;
select name,COALESCE(value,'我是NULL') from tb_test;
查詢結果:
-
在SQL中,NULL值與任何其它值的比較(即使是NULL)永遠不會為“真”。
包含NULL的表達式總是會導出NULL值,除非在關於操作符的文檔中以及表達式的函數中作了其他規定。下述示例中的所有列均返回NULL:
SELECT NULL, 1+NULL, CONCAT('test',NULL);
查詢結果:
如果打算搜索列值為NULL的列,不能使用expr = NULL測試。下述語句不返回任何行,這是因為,對於任何表達式,expr = NULL永遠不為“真”:
SELECT * FROM tb_test WHERE value = NULL;
查詢結果:
另外MySQL數據庫中執行SQL語句,需要小心幾個陷阱:
一、空值不一定為空
-
TimesTamp
數據類型如果往這個數據類型的列中插入
Null
值,則其代表的就是系統的當前時間 -
具有auto_increment屬性的列
如果往這屬性的列中插入Null值的話,則系統會插入一個正整數序列
-
而如果在其他數據類型中,如字符型數據的列中插入Null的數據,則其插入的就是一個空值。
二、Count等統計函數,在空值上也有特殊的應用
使用DISTINCT
、GROUP BY
或ORDER BY
時,所有NULL值將被視為等同的。
使用ORDER BY
時,首先將顯示NULL值,如果指定了DESC按降序排列,NULL值將最后顯示。
SELECT * FROM tb_test order by value;SELECT * FROM tb_test order by value desc;
查詢結果分別為:
三、對於聚合(累計)函數,如COUNT()、MIN()和SUM(),將忽略NULL值。
對此的例外是COUNT(*)
,它將計數行而不是單獨的列值。例如,下述語句產生兩個計數。首先計數表中的行數,其次計數value列中的非NULL值數目:
代碼如下:
SELECT COUNT(*), COUNT(value) FROM tb_test;
查詢結果為: