2015-09-04 24 views
2

我建立一個網站,可能有unicode字符在客戶端沒有指定,我想使用nvarchar作爲數據類型在sql服務器上。在varchar上使用nvarchar有什麼缺點嗎?存儲數據時,什麼並不總是使用nvarchar over varchar?

爲什麼任何人都希望在nvarchar上使用varchar,如果nvarchar可以容納更多字符varchar的話。使用nvarchar的唯一缺點是數據在nvarchar和varchar中會更大?

也可以Nvarchar仍然存儲varchar存儲的所有字符?

+1

[varchar和nvarchar有什麼區別?](http://stackoverflow.com/questions/144283/what-is-the-difference-between-varchar-and-nvarchar) –

+0

的另一個問答相同的主題http://stackoverflow.com/questions/612430/when-must-we-use-nvarchar-nchar-instead-of-varchar-char-in-sql-server –

+0

'nvarchar'使用兩倍的存儲空間作爲'varchar'(每個字符總是2個字節,而不是1個)。所以,如果你真的不需要* Unicode字符,這只是浪費空間 –

回答

4

我認爲你所做的(間接)點是你幾乎總是想要使用它。一般來說,最好從一開始就接受unicode數據,否則最終會導致您不想要的遺留頭痛。對於預期的投入,你會忽略什麼。系統有一個習慣,比你想象的要大,需要處理國際化的投入。有些字段需要限制。例如,如果您要存儲域名,那麼跨系統支持多語言字符可能仍然不可靠(正在進行),因此您需要限制輸入的內容。在這些情況下,您需要將輸入限制在較高的級別,例如通過UI級別的正則表達式,否則如果您在數據庫中聲明瞭varchar字段,則只會得到完全錯誤的字符如果一個unicode角色設法通過存儲的話。

空間不是問題,這些天,但也有性能方面的考慮,但情況是不太可能會超過對可擴展性的需求:

https://msdn.microsoft.com/en-us/library/ms189617.aspx

一個關鍵點是,你需要明確指定您在整個應用程序層始終使用UTF-8 始終爲以獲得全面的國際支持。

+1

正確 - 大部分。但是如果你需要例如將序列號或IP地址存儲爲僅由數字,點和破折號等組成的字符串,您可以使用'varchar'代替,並保存每行存儲的幾個字節。空間仍然** IS * *涉及繁忙服務器的主內存時出現問題! –

3

選擇數據類型與科學一樣具有藝術性。但是當它歸結時,你選擇的類型意味着一個約束。例如,我不會選擇nvarchar(50)來存儲美國郵政編碼。所以不要盲目選擇nvarchar,因爲它更寬容 - 這不是一個功能!選擇nvarchar是因爲您合法地認爲該字段需要適應Unicode字符。也就是說它可能不適合你所有的專欄。

至於你的第二個問題,nvarchar是一個嚴格的varchar超集。

相關問題