2016-07-07 49 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 
相关问题