sql-server - nvarchar varchar比較




varchar和nvarchar有什麼區別? (12)

nVarchar將幫助您存儲Unicode字符。 如果你想存儲本地化的數據,這是一條路。

只是nvarchar支持多字節字符嗎? 如果是這樣的話,除了存儲問題之外,真的有什麼意義可以使用varchars嗎?


nvarchar將數據存儲為Unicode,因此,如果要在數據列中存儲多語言數據(多種語言),則需要N變體。


Varchar(n)nvarchar(n)的主要區別是:

Varchar (可變長度,非Unicode字符數據)大小高達8000. 1.它是一種可變長度數據類型

  1. 用於存儲非Unicode字符

  2. 每個字符佔用1個字節的空間

Nvarchar :可變長度的Unicode字符數據。

1.它是一種可變長度的數據類型

2.用於存儲Unicode字符。

  1. 數據以Unicode編碼存儲。 每種語言都受支持。 (例如阿拉伯語,德語,印地語等等)

一個nvarchar列可以存儲任何Unicode數據。 一個varchar列僅限於一個8位代碼頁。 有些人認為應該使用varchar因為它佔用更少的空間。 我相信這不是正確的答案。 代碼頁不兼容性是一種痛苦,Unicode是代碼頁問題的解決方案。 現在,隨著廉價的磁盤和內存,真的沒有理由浪費時間在代碼頁上閒逛了。

所有現代操作系統和開發平台都在內部使用Unicode。 通過使用nvarchar而不是varchar ,每次讀取或寫入數據庫時都可以避免進行編碼轉換。 轉換需要時間,並且容易出錯。 從轉換錯誤中恢復是一個不平凡的問題。

如果您正在使用僅使用ASCII的應用程序進行連接,我仍然建議在數據庫中使用Unicode。 操作系統和數據庫整理算法將使用Unicode更好地工作。 Unicode與其他系統連接時避免了轉換問題。 你將為未來做準備。 而且,即使在享受完整Unicode存儲的某些優勢的情況下,您始終可以驗證您的數據僅限於7位ASCII碼,無論您需要維護哪個舊系統。


你是對的。 nvarchar存儲Unicode數據,而varchar存儲單字節字符數據。 除了存儲差異之外( nvarchar需要兩倍的存儲空間作為varchar ),您已經提到過,選擇nvarchar over varchar主要原因是國際化(即以其他語言存儲字符串)。


在這裡你可以看到varcharnvarchar的區別。

參考: SqlHints.com

有關Nvarchar和varchar的更多信息,請參閱此博客文章


我必須在這裡說(我意識到我可能會打開自己的slating!),但肯定是NVARCHAR實際上比VARCHAR 更有用(注意更多 !)的唯一時間是所有排序規則在所有的依賴系統上和數據庫本身是一樣的......? 如果不是的話,整理轉換必鬚髮生,所以VARCHAR就像NVARCHAR一樣可行。

為此,一些數據庫系統(如2012年之前的SQL Server)的頁面大小約為。 8K。 因此,如果您正在尋找存儲不在TEXTNTEXT字段中的可搜索數據,則VARCHAR提供全部8k的空間值,而NVARCHAR僅提供4k(字節的兩倍,空間的兩倍)。

總而言之,我認為,兩者的使用取決於:

  • 項目或上下文
  • 基礎設施
  • 數據庫系統

我會說,這取決於。

如果您開發一個桌面應用程序,其中的操作系統工作在Unicode(與所有當前的Windows系統一樣),並且語言本身支持Unicode(默認字符串是Unicode,就像在Java或C#中),然後轉到nvarchar。

如果您開發一個Web應用程序,其中字符串以UTF-8形式出現,並且語言是PHP,但仍然不支持本地Unicode(在版本5.x中),那麼varchar可能是更好的選擇。


我看了一下答案,很多人似乎建議使用nvarchar over varchar ,因為空間不再是問題,所以在啟用Unicode時沒有多餘的額外存儲空間。 那麼,當你想在你的列上應用一個索引時,情況並非總是如此。 SQL Server的索引字段大小限制為900字節。 所以,如果你有一個varchar(900)你仍然可以索引它,但不是varchar(901) 。 使用nvarchar ,字符數減半,因此您可以索引nvarchar(450) 。 所以如果你確信你不需要nvarchar ,我不推薦使用它。

一般來說,在數據庫中,我建議堅持您需要的大小,因為您可以隨時擴展。 例如,一位同事在工作中曾經認為對列使用nvarchar(max)沒有任何壞處,因為我們完全沒有存儲問題。 稍後,當我們試圖在此列上應用索引時,SQL Server拒絕了這一點。 但是,如果他開始使用varchar(5) ,我們可以簡單地將它擴展到我們需要的東西,而不會出現這樣的問題,這將需要我們執行現場遷移計劃來解決此問題。


我總是使用nvarchar,因為它允許我正在構建的任何數據可以承受我拋出的任何數據。 我的CMS系統不小心做了中文,因為我使用了nvarchar。 現在,任何新的應用程序都不應該真正關心所需的空間數量。


這取決於如何安裝Oracle。 在安裝過程中,設置了NLS_CHARACTERSET選項。 您可以通過查詢SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'來查找它。

如果你的NLS_CHARACTERSET是一個像UTF8這樣的Unicode編碼,那麼很好。 使用VARCHAR和NVARCHAR非常相似。 現在停止閱讀,只需要去閱讀。 否則,或者如果您無法控制Oracle字符集,請繼續閱讀。

VARCHAR - 數據存儲在NLS_CHARACTERSET編碼中。 如果在同一台服務器上有其他數據庫實例,則可能會受到它們的限制; 反之亦然,因為你必須分享這個設置。 這樣的字段可以存儲任何可以使用該字符集進行編碼的數據,而不是其他的 。 例如,如果字符集是MS-1252,則只能存儲英文字母,少量重音字母以及其他一些字符(如€和 - )。 您的應用程序僅適用於一些地區,無法在世界其他地方運行。 出於這個原因,它被認為是一個壞主意。

NVARCHAR - 數據以Unicode編碼存儲。 每種語言都受支持。 一個好主意。

存儲空間呢? VARCHAR通常是有效的,因為字符集/編碼是為特定語言環境定制設計的。 具有諷刺意味的是,NVARCHAR字段以UTF-8或UTF-16編碼存儲,基於NLS設置。 UTF-8對於“西方”語言非常有效,同時還支持亞洲語言。 對於亞洲語言,UTF-16非常有效,但仍支持“西方”語言。 如果擔心存儲空間,請選擇NLS設置以使Oracle根據需要使用UTF-8或UTF-16。

處理速度如何? 大多數新的編碼平臺本身使用Unicode(Java,.NET,甚至是多年前的C ++ std :: wstring!),所以如果數據庫字段是VARCHAR,它會強制Oracle在每次讀取或寫入時在字符集之間進行轉換,這並不是很好。 使用NVARCHAR可以避免轉換。

底線:使用NVARCHAR! 它避免了限制和依賴性,適用於存儲空間,並且通常也最適合性能。


遵循Sql Server VARCHAR和NVARCHAR數據類型的區別 。 在這裡你可以看到一個非常具有描述性的方式。

通常,nvarchar將數據存儲為Unicode,因此,如果要在數據列中存儲多語言數據(多種語言),則需要N變體。







nvarchar