1. 程式人生 > >資料庫中空字串和NULL值兩個概念的區別

資料庫中空字串和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 = ?
mytext永遠不可能匹配`NULL`值,無論你從客戶端如何傳值。匹配`NULL`的方法只能這樣查詢:
123 SELECT * FROM mytable WHERE mytext IS NULL
  • MySQL Manual (5.0版本)
    • 測試NULL需要用IS NULL或者IS NOT NULL=,<>,<, >等與NULL的計算比較,結果仍然為NULL
    • MySQL中,0NULL表示假,任何其他的值表示真。預設布林操作的真值為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屬性的整數列,將插入序列中的下一個編號。