有大量问题询问“什么是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
- 4. 什么是SQL Server中的.sql文件?
- 5. SQL Server中uniqueidentifier的用法是什么?
- 6. 什么是SQL Server中的IDENTITY_INSERT和MERGE?
- 7. 什么是SQL Server中的Service Broker?
- 8. SQL SERVER 2008中的SID是什么?
- 9. SQL Server中的“现在”是什么?
- 10. 什么是SQL Server LineageId?
- 11. 什么是在SQL Server
- 12. 什么是sql server management studio
- 13. 什么是SQL Server模块?
- 14. 什么是SQL Server Reporting Services?
- 15. 什么是SQL Server中的SQL Server Profiler NtUsername变量?
- 16. 在sql server中,什么是:Latin1_General_CI_AI与Latin1_General_CI_AS
- 17. SQL Server中NULL值是什么?
- 18. sql server中的标识列是什么?和什么是在SQL Server中的身份类型?
- 19. SQL Server - 什么是正确的语法?
- 20. SQL Server 2008 SP1的版本是什么?
- 21. 什么是localdb SQL Server的“服务器”?
- 22. 什么是SQL Server的命名约定?
- 23. Sql Server 2005和Sql Server 2008的主要区别是什么?
- 24. SQL Server 2008中SQL Server 2008 R2中dm_os_volume_stats的等效物是什么?
- 25. GO在SQL Server Management Studio和Transact SQL中的用途是什么?
- 26. 什么是SQL Server Profiler除了SQL Server Profiler?
- 27. SQL Server 2000 - 什么是“实际行数”?
- 28. SQL Server 2008:什么是理智检查?
- 29. 这是什么意思在SQL Server 2005
- 30. VS2005:什么是SQL Server项目用于?
http://stackoverflow.com/a/144300 – Blorgbeard