數據庫中空字符串和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(空)與 ""意義並不相同:

StackOverFlow.com上相關問題 “MySQL, better to insert NULL or empty string?” 高票答案:

使用NULL可以區分“沒有輸入數據”和“輸入空數據”, 差異在於:

NULL的長度就是NULL,空字符串的長度爲0
一串NULL數據比空字符串優先排序
COUNT(message)會將空字符串計數進去,但是不會將NULL數據們計入
可以使用綁定變量搜索某個空字符串,但是不可以這樣搜索NULL,例如:
1
2
3
SELECT * 
FROM mytable
WHERE mytext = ?
mytext永遠不可能匹配`NULL`值,無論你從客戶端如何傳值。匹配`NULL`的方法只能這樣查詢:
1
2
3
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屬性的整數列,將插入序列中的下一個編號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章