MySQL中NULL和空值的區別

2021-06-25 14:47:34 字數 3075 閱讀 9287

1樓:蘋果啊蘋果湯

空值是不佔用空間的,mysql中的null其實是佔用空間的。

不過在mysql資料庫中執行sql語句,需要小心兩個陷阱:

1、空值不一定為空

空值是乙個比較特殊的字段。在mysql資料庫中,在不同的情形下,空值往往代表不同的含義。這是mysql資料庫的一種特性。

如在普通的字段中(字元型的資料),空值就是表示空值。但是如果將乙個空值的資料插入到timestamp型別的字段中,空值就不一定為空。此時為出現什麼情況呢

我先建立了乙個表。在這個表中有兩個字段:user_id(其資料型別是int)、date(其資料型別是timestamp)。

現在往這個表中插入一條記錄,其中往date欄位中插入的是乙個null空值。可是當我們查詢時,其結果顯示的卻是插入記錄的當前時間。這是怎麼一回事呢?

其實這就是在mysql資料庫中執行sql語句時經常會遇到的乙個陷阱:空值不一定為空。在操作時,明明插入的是乙個空值的資料,但是最後查詢得到的卻不是乙個空值。

在mysql資料庫中,null對於一些特殊型別的列來說,其代表了一種特殊的含義,而不僅僅是乙個空值。對於這些特殊型別的列,各位讀者主要是要記住兩個。乙個就是筆者上面舉的timestamp資料型別。

如果往這個資料型別的列中插入null值,則其代表的就是系統的當前時間。另外乙個是具有auto_increment屬性的列。如果往這屬性的列中插入null值的話,則系統會插入乙個正整數序列。

而如果在其他資料型別中,如字元型資料的列中插入null的資料,則其插入的就是乙個空值。

2、空值不一定等於空字元

在mysql中,空值(null)與空字元(』』)相同嗎?答案是否定的。

在同乙個資料庫表中,同時插入乙個null值的資料和乙個』』空字元的資料,然後利用select語句進行查詢。顯然其顯示的結果是不相同的。從這個結果中就可以看出,空值不等於空字元。

這就是在mysql中執行sql語句遇到的第二個陷阱。在實際工作中,空值資料與空字元往往表示不同的含義。資料庫管理員可以根據實際的需要來進行選擇。

如對於**號碼等字段,可以預設設定為空值(表示根本不知道對方的**號碼)或者設定為空字元(表示後來取消了這個號碼)等等。由於他們在資料庫中會有不同的表現形式,所以資料庫管理員需要區別對待。筆者更加喜歡使用空值,而不是空字元。

這主要是因為針對空值這個資料型別有幾個比較特殊的運算字元。如果某個欄位是空字元,資料庫中是利用欄位名稱來代替。相反,如果插入的是空值,則直接顯示的是null。

這跟其他資料庫的顯示方式也是不同的。

一是is null 和is not null關鍵字。如果要判斷某個字段是否含用空值的資料,需要使用特殊的關鍵字。其中前者表示這個欄位為空,後者表示這個欄位為非空。

在select語句的查詢條件中這兩個關鍵字非常的有用。如需要查詢所有**號碼為空的使用者(需要他們補充**號碼資訊),就可以在查詢條件中加入is not null關鍵字。

二是count等統計函式,在空值上也有特殊的應用。如現在需要統計使用者資訊表中有**號碼的使用者數量,此時就可以使用count函式、同時將**號碼作為引數來使用。因為在統計過程中,這個函式會自動忽略空值的資料。

此時統計出來的就是有**號碼的使用者資訊。如果採用的是空字元的資料,則這個函式會將其統計進去。統計剛才建立的兩條記錄時,系統統計的結果是1,而不是2。

可見系統自動將null值的資料忽略掉了。

2樓:匿名使用者

"空值"是對null值的中文叫法,兩者同指乙個東西。

我想樓主是想弄清楚null(空值)與零長度字串''(或稱為空字串)之間的區別。

在**裡"零長度字串"用一對沒有間隔的英文引號''表示,它的資料型別是明確的即屬於字元型,儲存"零長度字串"是要佔用物理磁碟空間的;

而null值其資料型別是未知的,它不會佔用物理磁碟空間。

在不存在約束限制的情況我們可以將null值插入任何資料型別的字段裡,而零長度字串''只能插入到字元型資料型別欄位中,插入其它型別欄位會報錯。

我們通過實測看看null(空值)與零長度字串''(或稱為空字元長)之間的區別:

1)輸出所有的記錄

select * from students;

注意:此例輸出源表中的全部記錄,含null(空值)和零長度字串''.

2)輸出**為null(空值)的記錄

select * from students where phone is null;

注意:此例只輸出含null(空值)的記錄

3)輸出**為零長度字串的記錄

select * from students where phone='';

注意:此例只輸出含零長度字串的記錄。

4)輸出**不是零長度字串的記錄

select * from students where phone<>'';

注意:此例mysql的處理方式有些特別,連含null值得記錄也排除掉了,這與mssql的處理方式有點不一致。

5)輸出**不為空的記錄

select * from students where phone is not null;

注意:此例只要不含null值的記錄都予以輸出

3樓:

sql裡的null是真實的空,在儲存上並未分配儲存空間空字串,在儲存上已經分配儲存空間,但是是空內容。

兩者在sql中的判斷也不一樣

null的判斷: 欄位名 is null

空字串:欄位名=''

兩者可以合併判斷:

if isnull(欄位名,'')=''

print '空'

else

print '非空'

4樓:year醫海無邊

null是有值的,在mysql中有它自己的表示方法,而且在邏輯運算的時候,比如2 and null 結果為null

可是空值代表沒有這項,運算的時候不考慮.

所以php讀出來的時候是不一樣的null不知道是什麼數值(我忘記了),空串會顯示沒有這項(為空,要不就是會出錯,我忘記了)`~

所以程式設計的時候自己要注意自己資料庫裡存了什麼.記得的話,應該不再會遇到這種問題了.

5樓:來學習的

空:有杯子沒水,null:連杯子都沒有。

mysql中int和integer什麼區別

mysql中int和integer區別為 型別 bai不同 du zhi預設值不同 儲存dao不同。一 型別內不同 1 int 在mysql中,int的資料型別是基本容資料型別,是對integer的拆箱。2 integer 在mysql中,integer的資料型別是引用資料型別,是對int的裝箱。二...

sql中union和union all的區別

union all則將所有的結果全部顯示出來,不管是不是重複。union 對兩個結果集進行並集操作,不包括重複行,同時進行預設規則的排序 union在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最常見的...

EXCEL中,STDEV和STDEVP的區別是什麼

excel中stdev和stdevp的區別 1 含義不同 在excel中,stdev和stdevp都是用來計算標準差的函式,stdev是樣本標準差的函式,stdevp是總體標準差的函式。2 函式物件不同 stdev是用來計算調查的一部分個體的標準差,也就是樣本標準差。而stdevp用來計算研究物件的...