1. 程式人生 > >MySQL欄位屬性NUll的注意點

MySQL欄位屬性NUll的注意點

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的欄位查出來,否則就難以區分到底是沒有關聯記錄還是其他情況