2016-07-07 53 views
1

有大量問題詢問「什麼是char/varchar vs nchar/nvarchar?」答案始終表明,nchar/nvarchar將字符串存儲爲unicode,而char/varchar則不存在。那麼char/varchar存儲字符串是什麼呢?它是ASCII碼嗎?或者其他一些字符集?什麼是SQL Server中的char/varchar?

+1

http://stackoverflow.com/a/144300 – Blorgbeard

回答

6

那麼char/varchar存儲字符串是什麼呢?它是ASCII碼嗎?或者其他一些 字符集?

char/varchar的字符集由列或變量的排序規則定義。對於所有排序規則,128個ASCII字符都是相同的,使用代碼點0-127。排序規則支持的其餘字符將根據排序規則的代碼頁映射到代碼點。

大多數排序規則使用單字節代碼,在128-255代碼點範圍內提供128個附加字符。這些有時被稱爲擴展ASCII字符,但這是錯誤的,因爲它們不是標準的ASCII字符,並且分配給代碼點的字符可能因代碼頁而異。

SQL Server還支持幾個雙字節排序規則(代碼頁932,936,949,950)。這些排序規則還將128個ASCII字符存儲爲單個字節,並將2個字節存儲爲其他字符(類似於UTF-8)。

下面的查詢列出了每個歸類的代碼頁:

SELECT name AS CollationName 
     , COLLATIONPROPERTY(name, 'CodePage') AS CollationCodePage 
FROM fn_helpcollations(); 
+1

@MartinSmith,我會將其添加到我的答案中。謝謝。 –

-1

它可以是一個單字節字符集。對於varchar,Char和varchar爲每個字符分配一個字節和2個附加字節。

1

我打算將其標記爲重複。但是這個問題似乎不同於(What is the difference between varchar and nvarchar?),例如,OP不理解所述數據類型的使用。

這不是nvarchar將字符串存儲爲unicode。這就是nvarchar存儲unicode數據,varchar存儲非unicode數據。

的Varchar存儲Nonunicode數據哪個是unicode數據的子集

varchar使用一個字節(8位),以節省這意味着它有僅有8位來保存該數據和一個字符集的2^8的每個字符(即256)符號

nvarchar另一方面使用Unicode並需要2個字節(或16位),這意味着它可以保存(2^16)(即65536)符號。如果您不堅持使用標準的255字符集,或者需要不同語言的符號或字符,請使用nvarchar

使用此查詢給你完整的字符集VARCHAR允許:

DECLARE @cnt INT = 0; 
DECLARE @ASCTABLE TABLE(NUM int, ascChar varchar); 
WHILE @cnt < 256 
BEGIN 
    insert into @ASCTABLE (NUM, ascChar) values (@cnt, char(@cnt)) 
    SET @cnt = @cnt + 1; 
END 
select * from @ASCTABLE; 

如果你增加計數器極限以上256你會發現,它會簡單地以上255

什麼返回null

編輯: 這是一個網站列出所有的Unicode字符(http://unicode-table.com/en/nvarchar支持所有這些字符。 varchar僅支持來自該組的前255個字符。

+0

「ununicode數據是unicode數據的一個子集」沒有多大意義。 – Blorgbeard

+0

我的意思是在varchar(255符號)支持的非Unicode數據的上下文中,使其成爲nvarchar支持的unicode數據的子集(包括由varchar支持的所有符號的65536個符號) – Ash

0

CHARVARCHAR存儲數據作爲存儲的每個字符的一個字節,但NVARCHARNCHAR數據使用2個字節每個字符存儲的包含(或在事件代理對是需要,4個字節)國家代碼。通過選擇CHARVARCHAR除了英語之外,您正在將您的用例限制爲一種語言。然後通過整理確定。

所以存儲的字符串將如下「這是一個字符串」在CHARVARCHAR數據類型,然後用於NVARCHARNCHAR數據類型的附加字符被用於定義所支持n中的語言'這是一個Unicode字符串'。

引擎蓋下VARCHARCHAR字符串存儲在Windows-1252

使用通常情況下,是用於多語言支持在具有存儲的另一字節的額外開銷,否則沒有任何意義。我目前正在開發一個項目,其中所有內容都被修改爲支持另一種語言的Web應用程序,並導致修改SQL表以使用NVARCHARNCHAR數據類型。

-1

這裏是CHAR/VARCHAR之間的短差:

Char(4) takes 4b 

    varchar(4) takes 6b 

    or 

    Char(40) takes 40b 

    varchar(40) takes 6b 

    or 

    Char(400) takes 400b 

    varchar(400) takes 6b 
相關問題