什么是SQL Server中的char / varchar?

时间:2016-07-07 00:52:38

标签: sql-server

有很多问题要问“什么是char / varchar vs nchar / nvarchar?”答案总是声明nchar / nvarchar将字符串存储为unicode而char / varchar不存储。那么char / varchar将字符串存储为什么?是ASCII吗?还是其他一些字符集?

5 个答案:

答案 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