2009-08-13 38 views
11

我正在存儲名稱和姓氏,每個名稱最多30個字符。哪一個更好varcharnvarcharvarchar或nvarchar

我讀過nvarchar佔用的空間是varchar的兩倍,而nvarchar用於國際化。

那麼你應該使用什麼建議:nvarcharvarchar

也請讓我知道兩者的表現。兩者的性能是相同還是性能不同。因爲空間不是太大的問題。問題是表現。

+1

http://stackoverflow.com/questions/35366/varchar-vs-nvarchar-performance – 2009-08-13 11:51:00

回答

17

基本上,nvarchar意味着你可以處理大量的字母,而不僅僅是普通的英語。從技術上講,它意味着unicode支持,而不僅僅是ANSI。這意味着雙倍寬度的字符或大約兩倍的空間。現在,磁盤空間非常便宜,您不妨從一開始就使用nvarchar,而不是經歷在產品生命週期中不得不改變的痛苦。

如果您確定只需要支持一種語言,您可以使用varchar,否則我會使用nvarchar。

這已在here之前的SO上討論過。

EDITED:將ascii更改爲ANSI,如註釋中所述。

+3

是nitpicky:實際上,VARCHAR存儲ANSI數據 - 8位,通常基於代碼頁,如西歐或冰島或任何你需要的:-)它是ANSI - 8位 - 不是ASCII碼(= 7位) – 2009-08-13 11:41:09

6

首先,爲了澄清,nvarchar存儲unicode數據,而varchar存儲ANSI(8位)數據。它們的功能相同,但nvarchar佔用了兩倍的空間。

通常,我更喜歡使用varchar數據類型來存儲用戶名稱,除非這些名稱的字符超出了varchar可存儲的字符邊界。

它也依賴於數據庫排序規則。對於例如如果數據庫排序規則爲LATIN_CS_AS,則無法將俄語字符存儲在varchar字段中。但是,如果您正在使用僅用於俄羅斯的本地應用程序,則會將數據庫歸類設置爲俄語。這將做的是,它將允許您在varchar字段中輸入俄語字符,節省一些空間。

但是,現在大部分正在開發的應用程序都是國際化的,因此您必須決定哪些用戶將註冊,並根據這些決定數據類型。

2

我有紅色的nvarchar需要兩次作爲varchar。

是的。

nvarchar用於國際化。

是的。

你建議我應該使用nvarchar還是varchar?

這取決於應用程序。

+1

不正確。一個nvarchar需要兩倍於varchar的空間。您可以使用DATALENGTH函數輕鬆檢查這一點。 – Guffa 2009-08-13 11:18:08

+0

謝謝Kirtan。對由此造成的不便,我深表歉意。 – adatapost 2009-08-13 11:29:37

1

默認情況下使用nvarchar。現在幾乎沒有什麼理由去使用varchar,並且每種理由都需要使用nvarchar(允許使用國際字符;正如討論的那樣)。

1

varchar是每個字符1個字節,nvarchar是每個字符2個字節。

您將在nvarchar中使用更多空間,但還有更多允許的字符。額外的空間可以忽略不計,但你可能會錯過未來的額外人物。即使您不希望國際化,人們的名字中通常會有非英文字符(例如é,ñ或ö)。

我建議你使用nvarchar。

0

nvarchar類型是Unicode,因此它可以處理地球上每種語言中存在的任何字符。這些字符存儲爲UTF-16或UCS-2(不確定是哪一個,差別很小),因此每個字符使用兩個字節。

varchar類型使用8位字符集,因此它被限制爲您爲字段選擇的字符集的255個字符。有不同的字符集可處理不同的字符組,因此通常足夠用於某個國家或地區的本地文本。

如果varchar適用於你想要做的事情,你應該使用它。它的數據少一點,所以整體上稍微快一點。如果您需要處理各種字符,請使用nvarchar。

1

我有紅認爲,爲nvarchar需要兩倍的varchar

是。據微軟稱:「存儲大小,以字節爲單位,是輸入的字符數+ 2字節的兩倍」(http://msdn.microsoft.com/en-us/library/ms186939(SQL.90).aspx)。

但是存儲很便宜;我從不擔心幾個額外的字節。

此外,在未來節省自己的麻煩,並將最大寬度設置爲更大方,比如100個字符。當你使用varchar或nvarchar(而不是char/nchar)時,這絕對沒有存儲開銷。你永遠不知道什麼時候你會遇到一個超過30個字符的三重姓氏或長外國名字。

nvarchar用於國際化。

nvarchar可以存儲任何unicode字符,例如來自非拉丁腳本(阿拉伯文,中文等)的字符。我不確定你的應用程序將如何獲取數據(通過網頁,通過GUI工具包等),但很可能您使用的任何技術都支持unicode開箱即用。這意味着對於任何用戶輸入的數據(例如名稱),總是有接收非拉丁字符的可能性,如果不是現在,那麼在將來。

如果我正在構建一個新的應用程序,我會使用nvarchar。如果你喜歡,稱它爲「面向未來的」。

0

性能:
一個理由使用VARCHAR超過nvarchar的是,你可以在你的指標的兩倍多字符!索引鍵被限制爲900個字節
可用性:
應用程序是否永遠只能用於一個英語觀衆&包含英文名稱,使用VARCHAR

+0

從不遇到超過450個字符長度的索引。 – zszep 2011-03-26 07:44:51

0

數據存儲:「蘇尼爾」

VARCHAR (5)需要7B nvarchar(5)需要12B