MySQL null與not null和null與空值''''的區別詳解
相信很多用了MySQL很久的人,對這兩個欄位屬性的概念還不是很清楚,一般會有以下疑問:
- 我欄位型別是not null,為什麼我可以插入空值
- 為毛not null的效率比null高
- 判斷欄位不為空的時候,到底要 select * from table where column <> '' 還是要用 select * from table wherecolumn is not null 呢。
帶著上面幾個疑問,我們來深入研究一下null 和 not null 到底有什麼不一樣。
首先,我們要搞清楚“空值” 和 “NULL” 的概念:
- 空值是不佔用空間的
- mysql中的NULL其實是佔用空間的,下面是來自於MYSQL官方的解釋:
“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables,each NULL column takes one bit extra,rounded up to the nearest byte.”
打個比方來說,你有一個杯子,空值代表杯子是真空的,NULL代表杯子中裝滿了空氣,雖然杯子看起來都是空的,但是區別是很大的。
搞清楚“空值”和“NULL”的概念之後,問題基本就明瞭了,我們搞個例子測試一下:
CREATE TABLE `test` ( `col1` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`col2` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ) ENGINE = MYISAM ;
插入資料:
INSERT INTO `test` VALUES (null,1);
mysql發生錯誤:
#1048 - Column 'col1' cannot be null
再來一條
INSERT INTO `test` VALUES ('',1);
成功插入。
可見,NOT NULL 的欄位是不能插入“NULL”的,只能插入“空值”,上面的問題1也就有答案了。
對於問題2,上面我們已經說過了,NULL 其實並不是空值,而是要佔用空間,所以mysql在進行比較的時候,NULL 會參與欄位比較,所以對效率有一部分影響。
而且B樹索引時不會儲存NULL值的,所以如果索引的欄位可以為NULL,索引的效率會下降很多。
我們再向test的表中插入幾條資料:
INSERT INTO `test` VALUES ('',NULL); INSERT INTO `test` VALUES ('1','2');
現在表中資料:
現在根據需求,我要統計test表中col1不為空的所有資料,我是該用“<> ''” 還是 “IS NOT NULL” 呢,讓我們來看一下結果的區別。
SELECT * FROM `test` WHERE col1 IS NOT NULL
SELECT * FROM `test` WHERE col1 <> ''
可以看到,結果迥然不同,所以我們一定要根據業務需求,搞清楚到底是要用那種搜尋條件。
MYSQL建議列屬性儘量為NOT NULL
長度驗證:注意空值的''之間是沒有空格的。
mysql> select length(''),length(null),length(' '); +------------+--------------+--------------+ | length('') | length(null) | length(' ') | +------------+--------------+--------------+ | 0 | NULL | 2 | +------------+--------------+--------------+
注意事項:
- 在進行count()統計某列的記錄數的時候,如果採用的NULL值,系統會自動忽略掉,但是空值是會進行統計到其中的。
- 判斷NULL 用IS NULL 或者 IS NOT NULL,SQL語句函式中可以使用ifnull()函式來進行處理,判斷空字元用=''或者 <>''來進行處理
- 對於MySQL特殊的注意事項,對於timestamp資料型別,如果往這個資料型別插入的列插入NULL值,則出現的值是當前系統時間。插入空值,則會出現 0000-00-00 00:00:00
- 對於空值的判斷到底是使用is null 還是='' 要根據實際業務來進行區分。
到此這篇關於MySQL null與not null和null與空值''''的區別詳解的文章就介紹到這了,更多相關MySQL null與not null 內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!