有很多问题要问“什么是char / varchar vs nchar / nvarchar?”答案总是声明nchar / nvarchar将字符串存储为unicode而char / varchar不存储。那么char / varchar将字符串存储为什么?是ASCII吗?还是其他一些字符集?
答案 0 :(得分:6)
那么char / varchar将字符串存储为什么?是ASCII吗?或者其他一些 字符集?
char / varchar的字符集由列或变量的排序规则定义。使用代码点0-127,所有排序规则的128个ASCII字符相同。排序规则支持的其余字符根据排序规则的代码页映射到代码点。
大多数归类使用单字节代码,在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 :(得分: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个字符。
答案 2 :(得分:0)
CHAR 和 VARCHAR 将数据存储为每个字符的一个存储字节,但 NVARCHAR 或 NCHAR 数据每个字符使用2个字节的存储空间来包含(或者在需要代理对的情况下,4个字节)国家代码。通过选择 CHAR 或 VARCHAR ,您将使用案例限制为除英语之外的一种语言。然后通过整理确定。
因此,存储的字符串在 CHAR 或 VARCHAR 数据类型中将显示为“这是一个字符串”,然后是 NVARCHAR 或 NCHAR 数据类型附加字符用于定义支持的语言N'这是Unicode中的字符串。
引擎盖 VARCHAR 和 CHAR 字符串存储在Windows-1252
中一般情况下,用于多语言支持的用例,否则无法承受另一个存储字节的额外开销。我目前正在开发一个项目,其中所有内容都被修改为Web应用程序以支持另一种语言,这导致修改SQL表以使用 NVARCHAR 和 NCHAR 数据类型
答案 3 :(得分:-1)
它可以是单字节字符集。 Char和varchar为每个字符分配一个字节,另外2个字节用于varchar。
答案 4 :(得分:-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