回覆列表
  • 1 # 島國君

    如果除非必須不建議設定為null,會有效能問題。優點就是………嗯,可以設定為null,在某些場景下會更方便。

  • 2 # shw849

    NULL是建立資料表時預設的,初級或不知情的或怕麻煩的程式設計師不會注意這點。

    如果把欄位設定成允許null那麼在查詢語句中mysql難以最佳化,而且它會使索性、索引統計和值更加複雜。

    另外,可空列需要更多的儲存空間。

  • 3 # JasonZHZ

    優點:null值可以代表另一種可能,比如是否做了核算檢測,除了明確的0-否,1-是外,還有一種可能null-未知。

  • 4 # 夕陽雨晴

    1. 問題描述

    Mysql的欄位設定為null有什麼優點呢?

    問題結論

    網上隨便找了找,沒有發現什麼優點,缺點倒是一大堆。在實踐過程中,預設為null最大的優點應該算是方便吧,一些非核心欄位預設為空,前端用的時候判斷為null時不展示,或者為null時將其設定為預設的欄位值。

    2. 簡述Mysql的欄位設定為null的缺點

    2.1 查詢條件中有null列需要格外注意,容易出錯。

    mysql中,任何值和null的比較,都返回null,而不是true或者false。包括null=null結果都是null,不是true。

    所以一旦在查詢條件使用了null,而不是使用is null或者is not null將出現錯誤。不會返回任何值。由於mysql中,null值和任何值的比較,都會返回null,導致條件中有null的時候,返回結果和想想中的可能就不一樣了。

    2.2 部分函式入參有null的時候,返回值是null。

    contact()方法,如果入參有null,返回是null。

    2.3 Null列需要更多的儲存空間:需要一個額外位元組作為判斷是否為NULL的標誌位。

    table1和table3是一模一樣的,唯一不同的就是user_name欄位,table1是not null,而table3的user_name沒有not null的約束。

    2.4 Explain輸出的key_len的計算規則和三個因素有關:資料型別、字元編碼、是否為 NULL。

    Utf8mb4編碼是4位元組,utf8是3位元組

    not null的欄位

    key_len=索引欄位佔用的位元組數+2位元組可變長欄位長度(定長型別不需要)

    如編碼集=utf8mb6的varchar(20),ken_len=82

    62=20*4 +2

    允許為null欄位

    key_len=索引欄位佔用的位元組數+2位元組可變長欄位長度(定長型別不需要)+1(儲存是否為null的標識)

    如編碼集=utf8mb6的varchar(20),ken_len=83

    83=20*4+2+1

    所以說索引欄位最好不要為NULL,因為NULL會使索引、索引統計和值更加複雜,並且需要額外一個位元組的儲存空間。

  • 5 # 日衝資訊 黃

    現在的計算機語言中普遍採用了三值邏輯。也就是真、假、空三值。空代表非真非假的不確定狀態。三值邏輯為空設定了這樣的真值表:

    NOT NULL IS NULLTRUE AND NULL IS NULLFALSE AND NULL == FALSENULL AND NULL IS NULLTRUE OR NULL == TRUEFALSE OR NULL IS NULLNULL OR NULL IS NULLX==NULL IS NULL

    資料庫中使用NULL可以處理更豐富的條件。比如,學生的成績存在三種狀態:及格、不及格、曠考。使用NULL就可以在一個欄位中體現出來。

    對存在NULL值的欄位檢索時,要注意使用上面的真值表,特別是不能用"X=NULL"或者"X!=NULL"做判斷,因為這兩個判斷都不為真。正確的做法是“X IS NULL"。另外,EXISTS和IN對NULL的判斷也是不一樣的,建議自己去試試。很多書上不建議使用NULL,這主要是因為NULL的特殊性質,使得它無法參與排序,因此,無法對包含NULL的欄位建立索引,容易引起FULLSCAN降低查詢效率。

    資料庫中引入NULL,是為了確保SQL語言邏輯的完備性。如果沒有NULL,有些邏輯是不能完美實現的。很多人覺得沒有必要搞三值,用兩個真假就可以代替了。事實上,這種做法無意中引入了四個值,多出來的一個值容易引起邏輯混亂,產生BUG。

  • 中秋節和大豐收的關聯?
  • 雙膽電熱水器使用需要注意什麼?