有大量問題詢問「什麼是char/varchar vs nchar/nvarchar?」答案始終表明,nchar/nvarchar將字符串存儲爲unicode,而char/varchar則不存在。那麼char/varchar存儲字符串是什麼呢?它是ASCII碼嗎?或者其他一些字符集?什麼是SQL Server中的char/varchar?
回答
那麼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();
@MartinSmith,我會將其添加到我的答案中。謝謝。 –
它可以是一個單字節字符集。對於varchar,Char和varchar爲每個字符分配一個字節和2個附加字節。
我打算將其標記爲重複。但是這個問題似乎不同於(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個字符。
「ununicode數據是unicode數據的一個子集」沒有多大意義。 – Blorgbeard
我的意思是在varchar(255符號)支持的非Unicode數據的上下文中,使其成爲nvarchar支持的unicode數據的子集(包括由varchar支持的所有符號的65536個符號) – Ash
CHAR和VARCHAR存儲數據作爲存儲的每個字符的一個字節,但NVARCHAR或NCHAR數據使用2個字節每個字符存儲的包含(或在事件代理對是需要,4個字節)國家代碼。通過選擇CHAR或VARCHAR除了英語之外,您正在將您的用例限制爲一種語言。然後通過整理確定。
所以存儲的字符串將如下「這是一個字符串」在CHAR或VARCHAR數據類型,然後用於NVARCHAR或NCHAR數據類型的附加字符被用於定義所支持n中的語言'這是一個Unicode字符串'。
引擎蓋下VARCHAR和CHAR字符串存儲在Windows-1252
使用通常情況下,是用於多語言支持在具有存儲的另一字節的額外開銷,否則沒有任何意義。我目前正在開發一個項目,其中所有內容都被修改爲支持另一種語言的Web應用程序,並導致修改SQL表以使用NVARCHAR和NCHAR數據類型。
這裏是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
- 1. 什麼是SQL Server
- 2. 什麼是SQL Server
- 3. 什麼是SQL Server中的Service Broker?
- 4. 什麼是在SQL Server
- 5. 什麼是SQL Server Reporting Services?
- 6. 什麼是SQL Server模塊?
- 7. 什麼是sql server management studio
- 8. 什麼是SQL Server中的SQL Server Profiler NtUsername變量?
- 9. SQL Server中NULL值是什麼?
- 10. sql server中的標識列是什麼?和什麼是在SQL Server中的身份類型?
- 11. 什麼是SQL Server的命名約定?
- 12. SQL Server 2008 SP1的版本是什麼?
- 13. 什麼是localdb SQL Server的「服務器」?
- 14. SQL Server - 什麼是正確的語法?
- 15. Sql Server 2005和Sql Server 2008的主要區別是什麼?
- 16. SQL Server 2008中SQL Server 2008 R2中dm_os_volume_stats的等效物是什麼?
- 17. GO在SQL Server Management Studio和Transact SQL中的用途是什麼?
- 18. 什麼是MAXDOP選項和Parallelismin SQL SERVER
- 19. VS2005:什麼是SQL Server項目用於?
- 20. SQL Server:什麼是ODBC規範函數?
- 21. 什麼是SQL Server implict事務?
- 22. SQL Server 2008:什麼是理智檢查?
- 23. SQL Server 2000 - 什麼是「實際行數」?
- 24. 什麼是PostgreSQL相當於SQL Server NVARCHAR?
- 25. 究竟是什麼SQL Server卡住?
- 26. sql server圖標是什麼意思?
- 27. 這是什麼意思在SQL Server 2005
- 28. SQL Server 2016中SQL Server Integration Services服務器的用途是什麼?
- 29. SQL Server Compact與SQL Server和SQL Server Standard有什麼區別?
- 30. 觸發器中的MySql的NEW.some_column的SQL Server模擬是什麼?
http://stackoverflow.com/a/144300 – Blorgbeard