背景:
今天因為MySQL中NULL和空值的區(qū)分錯誤痴鳄,解決一個很簡單的數(shù)據(jù)庫查詢問題花了一個小時瘟斜,很是懊悔,所以開始正文吧痪寻!
區(qū)別詳細:
1 空值和NULL為兩個概念
空值在MySQL中不占空間哼转,NULL在mysql中占有空間。2 空值不一定為空
① 在MySQL數(shù)據(jù)庫中槽华,空值是一個比較特殊的字段壹蔓,在不同的情形下,空值往往代表不同的含義猫态。這是MySQL數(shù)據(jù)庫的一種特性佣蓉。如在普通的字段中(字符型的數(shù)據(jù)),空值就是表示空值亲雪。但是如果將一個空值的數(shù)據(jù)插入到TimesTamp類型的字段中勇凭,空值就不一定為空。
② 一個是具有auto_increment屬性的列义辕。如果往這屬性的列中插入Null值的話虾标,則系統(tǒng)會插入一個正整數(shù)序列。
③ 一個是具有TimesTamp數(shù)據(jù)類型的列灌砖。如果往這個數(shù)據(jù)類型的列中插入Null值璧函,則其代表的就是系統(tǒng)的當前時間。
④ 在其他數(shù)據(jù)類型中基显,如字符型數(shù)據(jù)的列中插入NULL的數(shù)據(jù)蘸吓,則其插入的就是一個空值。3空值不一定等于空字符
① IS NULL 和IS NOT NULL關(guān)鍵字撩幽。如果要判斷某個字段是否含用空值的數(shù)據(jù)库继,需要使用特殊的關(guān)鍵字。其中前者表示這個字段為空窜醉,后者表示這個字段為非空宪萄。在Select語句 的查詢條件中這兩個關(guān)鍵字非常的有用。
② 是Count等統(tǒng)計函數(shù)榨惰,在空值上也有特殊的應(yīng)用拜英。如現(xiàn)在需要統(tǒng)計用戶信息表中有電話號碼的用戶數(shù)量,此時就可以使用count函數(shù)读串、同時將電話號碼作為參數(shù)來使用聊记。因為在統(tǒng)計過程中,這個函數(shù)會自動忽略空值的數(shù)據(jù)恢暖。此時統(tǒng)計出來的就是有電話號碼的用戶信息排监。如果采用的是空字符的數(shù)據(jù),則這個函數(shù)會將其統(tǒng)計進去杰捂。統(tǒng)計剛才建立的兩條記錄時舆床,系統(tǒng)統(tǒng)計的結(jié)果是1,而不是2嫁佳“ざ樱可見系統(tǒng)自動將NULL值的數(shù)據(jù)忽略掉了。
示例:
id (bigint increment) | sid (bigint) | date |
---|---|---|
1 | NULL | 2018-1-1 00:00:00 |
2 | 0 | NULL |
3 | 0 | 2018-1-1 00:00:00 |
//獲得sid為空的數(shù)量:1
SELECT COUNT(*) FROM TEST WHERE SID IS NULL;
//獲得sid不為空的數(shù)量:2
SELECT COUNT(*) FROM TEST WHERE SID IS NOT NULL;
//獲得sid為空值的數(shù)量:2
SELECT COUNT(*) FROM TEST WHERE SID = '';
//獲得sid為‘0’的數(shù)量:2
SELECT COUNT(*) FROM TEST WHERE SID = '0';
//獲得date為空的數(shù)量:1
SELECT COUNT(*) FROM TEST WHERE DATE IS NULL;
//獲得date不為空的數(shù)量:2
SELECT COUNT(*) FROM TEST WHERE DATE IS NOT NULL;
//獲得date為空值的數(shù)量:0
SELECT COUNT(*) FROM TEST WHERE DATE ='';
注:上面sid為空值和sid為'0'的查詢結(jié)果相同是因為蒿往,mysql默認bigint的值為NULL盛垦,但是NULL又不是INT類型,所以mysql開發(fā)人員默認將其默認值設(shè)為'0'瓤漏,這一點一定要注意腾夯,今天就因為這個卡了一個小時 %>_<%