MySQL字段屬性應該盡量設置為NOT NULL
除非你有一個很特別的原因去使用 NULL 值,你應該總是讓你的字段保持 NOT NULL。這看起來好像有點爭議,請往下看。
空值("") 和 “NULL” 的概念:
1)空值是不占用空間的
2)MySQL中的NULL其實是占用空間的
所謂的NULL就是什么都沒有,連\0都沒有,\0在字符串中是結束符,但是在物理內存是占空間的,等於一個字節,而NULL就是連這一個字節都沒有。
NULL不能簡單=判斷
其次,在數據庫里是嚴格區分的,任何數跟NULL進行運算都是NULL, 判斷值是否等於NULL,不能簡單用=,而要用IS NULL關鍵字。
可以看一個列子,我創建一個表,字段包括id 和age:
create table t1(id int , age unique);
然后執行十次:
insert into t1(id) values(1);
給表只添加id,age字段默認值是NULL,發現可以一直添加,這是為什么呢!,我明明設置了unique屬性啊,這就是因為任何數跟NULL進行運算都是NULL, 判斷值是否等於NULL,不能簡單用=,而要用IS NULL關鍵字。
3、not null指是NULL,而不是字符串空值('')
數據庫的字段col1設為NOT NULL, 僅僅說明該字段不能為NULL, 也就是說只有在
INSERT INTO table1(col1) VALUES(NULL);
這種情況下數據庫會報錯,而
INSERT INTO table1(col1) VALUES(‘’);
不會報錯。
(如果字段是自增ID,第一句不會報錯,這不能說明是可以為NULL,而是 數據庫系統會根據ID設的缺省值填充,或者如果是自增字段就自動加一等缺省操作。)
4、盡量設置成not null原因
1、含有空值的列很難進行查詢優化,而且對表索引時不會存儲NULL值的,所以如果索引的字段可以為NULL,索引的效率會下降很多。因為它們使得索引、索引的統計信息以及比較運算更加復雜。你應該用0、一個特殊的值或者一個空串代替空值。
2、聯表查詢的時候,例如LEFT JOIN table2,若沒有記錄,則查找出的table2字段都是null。假如table2有些字段本身可以是null,那么除非把table2中not null的字段查出來,否則就難以區分到底是沒有關聯記錄還是其他情況