SQL Server:關於Null的一些事

來源:互聯網
上載者:User
    我們設計表時,在欄位是否允許Null值這個問題上,有時會爭論一番。資料庫牛人Kalen Delaney則給了一下建議
    1,永遠不要在使用者表中允許NULL值
    2,在使用者表定義中包含一個NOT NULL限制
    3,不要依賴資料庫屬性來控制NULL值的行為

    對於第一點,我們反向說,如果允許NULL,會給我們帶來什麼影響。
        1,SQL 在每條記錄中都設定了一個特殊的bitmap來顯示哪些允許空值的列上儲存的真的是空值。如果是NULL,在訪問每一行的時候SQL Server都必須對這個bitmap進行解碼。
        2,允許NULL還增加了應用程式代碼的複雜度,總的添加一些特殊的邏輯來處理這個NULL值,這常常會導致bug。

    第二點,在包含不允許NULL的列上,要加入一些預設值,如果不允許NULL,但是還沒有加預設值,在沒有顯示列插入的話,就會造成INSERT的失敗,SQL Server預設在INSERT中,對沒有顯示的列做NULL插入。

    最後一點,主要涉及到於NULL值的比較。在我們印象中,是用IS NULL,IS NOT NULL比較呢,還是用=,<>比較呢。這取決於資料庫選項ANSI NULLS,我們不可能更改資料庫選項(我們大部分不是DBA),但是我們可以使用會話設定SET ANSI_NULLS相當於資料庫選項ANSI NULLS。當這個選項為真是,所有與空值的比較都將得出FALSE,代碼必須使用IS NULL條件來判斷是否為空白,而當這個選項為假時,如果進行比較的兩個值都是空值將得出TRUE,SQL Server允許將 =NULL作為IS NULL的同義字,將<> NULL 作為IS NOT NULL的同義字。
    如果忘記這個選項,建議用IS NULL判斷空,IS NOT NULL判斷非空。
    測試如下:

     在t3表中只有兩行資料,
  

    SET ANSI_NULLS OFF 時:

  

    SET ANSI_NULLS ON 時
  

    

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.