對於sql的新手,null值的概念常常會造成混淆,他們常認為null是與空字串''相同的事。情況並非如此。例如,下述語句是完全不同的:
mysql> insert into my_table (phone) values (null);
mysql> insert into my_table (phone) values ('');
這兩條語句均會將值插入phone(**)列,但第1條語句插入的是null值,第2條語句插入的是空字串。第1種情況的含義可被解釋為「**號碼未知」,而第2種情況的含義可被解釋為「該人員沒有**,因此沒有**號碼」。
為了進行null處理,可使用is null和is not null操作符以及ifnull()函式。
在sql中,null值與任何其它值的比較(即使是null)永遠不會為「真」。包含null的表示式總是會匯出null值,除非在關於操作符的文件中以及表示式的函式中作了其他規定。下述示例中的所有列均返回null:
mysql> select null, 1+null, concat('invisible',null);
如果打算搜尋列值為null的列,不能使用expr = null測試。下述語句不返回任何行,這是因為,對於任何表示式,expr = null永遠不為「真」:
mysql> select * from my_table where phone = null;
要想查詢null值,必須使用is null測試。在下面的語句中,介紹了查詢null**號碼和空**號碼的方式:
mysql> select * from my_table where phone is null;
mysql> select * from my_table where phone = '';
如果你正在使用myisam、innodb、bdb、或memory儲存引擎,能夠在可能具有null值的列上增加1條索引。如不然,必須宣告索引列為not null,而且不能將null插入到列中。
用load data infile讀取資料時,對於空的或丟失的列,將用''更新它們。如果希望在列中具有null值,應在資料檔案中使用/n。在某些情況下,也可以使用文本性單詞「null」。
使用distinct、group by或order by時,所有null值將被視為等同的。
使用order by時,首先將顯示null值,如果指定了desc按降序排列,null值將最後顯示。
對於聚合(累計)函式,如count()、min()和sum(),將忽略null值。對此的例外是count(*),它將計數行而不是單獨的列值。例如,下述語句產生兩個計數。首先計數表中的行數,其次計數age列中的非null值數目:
mysql> select count(*), count(age) from person;
對於某些列型別,mysql將對null值進行特殊處理。如果將null插入timestamp列,將插入當前日期和時間。如果將null插入具有auto_increment屬性的整數列,將插入序列中的下乙個編號。
MySQL資料庫中與 NULL值有關的幾個問題
對於sql的新手,null值的概念常常會造成混淆,他們常認為null是與空字串 相同的事。情況並非如此。例如,下述語句是完全不同的 mysql insert into my table phone values null mysql insert into my table phone values...
MySQL資料庫中與NULL值有關的幾個問題
對於sql的新手,null值的概念常常會造成混淆,他們常認為null是與空字串 相同的事。情況並非如此。例如,下述語句是完全不同的 mysql insert into my table phone values null mysql insert into my table phone values...
資料庫中欄位設計與NULL值操作
null值作為資料庫中的乙個特殊操作值,在日常的操作中要尤其留意。如果使用不當,會在某些特定條件下,導致sql執行的結果集有錯誤。但是這種錯誤並非資料庫本身造成的,而是在設計中對null處理不當的造成的。一次在檢查資料庫執行報告時看到了一句sql,和相關的研發人員溝通後知道,其需要的功能是顯示最新時...