資料庫中空字串和NULL值兩個概念的區別
資料庫中的NULL
表示“沒有對(列)變數輸入資料”,即在資料庫中的NULL
可以區分“沒有對(列)變數輸入資料”和“有對(列)變數輸入資料”這兩類情況。而輸入空字串,則是這裡的“有對(列)變數輸入資料”這一類情況,即有輸入資料,只是輸入的資料為空字串(含有終止符的還是)。從這個意義上講,如int
t;語句,也是屬於這裡的“有對(列)變數輸入資料”這一類情況,只是不是有程式設計師自己輸入值,而是由(編譯)系統輸入一個隨機數而已。
資料庫中的NULL
和C++等語言中的NULL
的區別:
資料庫中的NULL
是一個關鍵字,表示“沒有對(列)變數輸入資料”
C++等語言中的NULL
是一個巨集,表示為整數0一般。
所以在原始碼的繫結變數函式裡不能使用Null(是一個巨集)或是'Null'(是一個字串),因為兩者都不表示資料庫中的關鍵字NULL。
當然,在原始碼裡,不含有繫結變數的SQL語句字串(如,“insert into 表1 values(null,null)”)裡出現Null是可以作為資料庫的Null解釋的,該SQL語句字串用step函式執行可以成功達到目的即表字段裡的值為Null。
===========================================================================
MySQL中NULL與空值的區別
昨天在工作時,出現一個問題:資料庫中建表某個欄位規定為NOT NULL
的,但是插入的相應欄位的字串為""
時候,直接插入資料庫中,而沒有禁止插入。
在網上查了一下,發現在MySQL中,NULL
(空)與 ""
意義並不相同:
-
使用
NULL
可以區分“沒有輸入資料”和“輸入空資料”, 差異在於:NULL
的長度就是NULL
,空字串的長度為0
- 一串
NULL
資料比空字串優先排序 COUNT(message)
會將空字串計數進去,但是不會將NULL
資料們計入- 可以使用繫結變數搜尋某個空字串,但是不可以這樣搜尋
NULL
,例如:
123 |
SELECT * FROM mytableWHERE |
mytext永遠不可能匹配`NULL`值,無論你從客戶端如何傳值。匹配`NULL`的方法只能這樣查詢:
123 | SELECT * FROM mytable WHERE mytext IS NULL |
- MySQL Manual (5.0版本)
- 測試
NULL
需要用IS NULL
或者IS NOT NULL
;=
,<>
,<
,>
等與NULL
的計算比較,結果仍然為NULL
- MySQL中,
0
或NULL
表示假,任何其他的值表示真。預設布林操作的真值為1
- 在
GROUP BY
操作中,兩個NULL
被認為是相等的;並且NULL
值在ORDER BY ... ASC
中第一個顯示,而在DESC
中則是最後一個
- 測試
MySQL空字串和NULL值問題
MySQL空字串和NULL值我們都經常會見到,但是這二者並不是一個概念,下面就為您介紹NULL與MySQL空字串的區別,供您參考。
對於SQL的新手,NULL值的概念常常會造成混淆,他們常認為NULL與MySQL空字串是相同的事。情況並非如此。例如,下述語句是完全不同的:
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屬性的整數列,將插入序列中的下一個編號。