1 背景
NULL也就是字段值為空,空值也就是字段中存儲空字符(‘’),要注意空字符(‘’)和含有空格的字符是不一樣的(’ ')
2 區(qū)別
2.1 占用空間區(qū)別
select length(NULL), length(''), Length(' '),length(0);
--->NULL,0,1,1
- 1
- 2
從上面看出空值(‘’)的長度是0,是不占用空間的;含有一個空格的(’ ')長度為1,是占用空間的;而NULL長度是NULL,實際上它也是占用空間的
通俗的講:空值就像是一個真空轉態(tài)杯子,什么都沒有,而NULL值就是一個裝滿空氣的杯子,雖然看起來都是一樣的,但是有著本質(zhì)的區(qū)別。
2.2 插入/查詢方式區(qū)別
創(chuàng)建一個表,tb_test
CREATE TABLE `tb_test` (
`one` varchar(10) NOT NULL,
`two` varchar(255) DEFAULT NULL )
ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 1
- 2
- 3
- 4
插入進行驗證:
– 全部插入 NULL,失敗
mysql> INSERT tb_test VALUES (NULL,NULL);
1048 - Column 'one' cannot be null
- 1
- 2
– 全部插入 空值,成功
mysql> INSERT tb_test VALUES ('','');
Query OK, 1 row affected
- 1
- 2
模擬數(shù)據(jù):
INSERT tb_test VALUES (1,NULL);
INSERT tb_test VALUES ('',2);
INSERT tb_test VALUES (3,3);
- 1
- 2
- 3
空值字段:
– 使用 is null/is not null
mysql> SELECT * FROM tb_test where one is NULL; Empty mysql> SELECT * FROM tb_test where one is not NULL; | one | two | | 1 | NULL | | | 2 | | 3 | 3 | -- 使用 = 、!= mysql> SELECT * FROM tb_test where one = ''; | one | two | | | 2 | mysql> SELECT * FROM tb_test where one != ''; | one | two | | 1 | NULL | | 3 | 3 | NULL值字段: -- 使用 is null/is not null mysql> SELECT * FROM tb_test where two is not NULL; | one | two | | | 2 | | 3 | 3 | mysql> SELECT * FROM tb_test where two is NULL; | one | two | | 1 | NULL| -- 使用 = 、!= mysql> SELECT * FROM tb_test where two = ''; Empty set mysql> SELECT * FROM tb_test where two != ''; | one | two | | 2 | | 3 | 3 |
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
如果要單純查NULL值列,則使用 is NULL去查,單純?nèi)ゲ榭罩?‘’)列,則使用 =‘’,并且='‘與= ’ ‘結果一樣。
建議查詢方式:NULL值查詢使用is null/is not null查詢,而空值(’’)可以使用=或者!=、<、>等算術運算符。
3 總結
1、空值不占空間,NULL值占空間。當字段不為NULL時,也可以插入空值。
2、當使用 IS NOT NULL 或者 IS NULL 時,只能查出字段中沒有不為NULL的或者為 NULL 的,不能查出空值。
3、判斷NULL 用IS NULL 或者 is not null,SQL 語句函數(shù)中可以使用IFNULL()函數(shù)來進行處理,判斷空字符用 =‘‘或者<>’‘來進行處理。
4、在進行count()統(tǒng)計某列的記錄數(shù)的時候,如果采用的NULL值,會別系統(tǒng)自動忽略掉,但是空值(’’)是會進行統(tǒng)計到其中的。
5、實際到底是使用NULL值還是空值(‘’),根據(jù)實際業(yè)務來進行區(qū)分。int類型盡量默認為’0’