我有一個數據庫,其中包含一個包含與請求關聯的許可證號碼的字段。許可證號碼是13位數字,但可能不會簽發許可證。Char vs Varchar當不總是填充
就這樣說,我目前有一個字段定義爲char(13),允許NULL。我被要求將它改爲varchar(13),因爲char的,如果爲NULL,仍然使用全長。
這是可取的嗎?除空間使用外,還有其他優點或缺點嗎?
我知道在一個理想的關繫系統中,許可證號將被存儲在另一個相關的表中以避免使用NULL,但事實就是如此。
我有一個數據庫,其中包含一個包含與請求關聯的許可證號碼的字段。許可證號碼是13位數字,但可能不會簽發許可證。Char vs Varchar當不總是填充
就這樣說,我目前有一個字段定義爲char(13),允許NULL。我被要求將它改爲varchar(13),因爲char的,如果爲NULL,仍然使用全長。
這是可取的嗎?除空間使用外,還有其他優點或缺點嗎?
我知道在一個理想的關繫系統中,許可證號將被存儲在另一個相關的表中以避免使用NULL,但事實就是如此。
那麼,如果你不必使用足夠的空間,那麼你可以在內存中放置更多的頁面。如果你能做到這一點,那麼你的系統將運行得更快。這可能看起來微不足道,但我最近調整了客戶端表上的數據類型,將讀取量減少了25%,CPU減少了大約20%。
至於哪個更容易處理,大衛斯特拉頓提到的好處值得注意。我討厭在字符串構建中使用修剪功能。
最大的優點(一般來說,不一定是你的特定情況)我知道的是,在代碼中,如果你使用varchar,你不必在每次顯示時都使用Trim函數。在使用名字字段和姓氏字段並將它們組合成全名時,我遇到了很多問題。這只是令人討厭,並使代碼不易讀。
如果字段應該總是正好13個字符,那麼我可能會將其保留爲CHAR(13)。
此外,從BOL一個有趣的註釋:
如果SET ANSI_PADDING爲OFF時要麼 CREATE TABLE或ALTER TABLE是 執行時,一個字符列,它是 定義爲NULL時爲varchar處理。
編輯:您希望該字段爲NULL的頻率如何?如果95%的時間內都會有人使用,那麼做出這個改變是不值得的。
如果您使用的是sql server 2008,那麼您應該查看行壓縮,並且如果該列的空值大於60%,則應該查看稀疏字段。
如果所有填充的字段都使用該數量,我會將數據類型保留爲char(13)。
行壓縮信息: http://msdn.microsoft.com/en-us/library/cc280449.aspx