SQL服务器中char、nchar、varchar和nvarchar有什么区别?

nvarchar是什么意思?

SQL服务器中的charncharvarcharnvarchar有什么区别?

668024 次浏览

nchar和char的操作方式几乎完全相同,nvarchar和varchar也是如此。它们之间唯一的区别是nchar/nvarchar存储Unicode字符(如果您需要使用扩展字符集,则必不可少),而varchar则不存储。

由于Unicode字符需要更多的存储空间,因此nchar/nvarchar字段占用的空间是原来的两倍(例如,在早期版本的SQLServer中,nvarchar字段的最大大小为4000)。

这个问题是这一个的副本。

nchar(10)是长度为10的固定长度Unicode字符串。nvarchar(10)是最大长度为10的可变长度Unicode字符串。通常,如果所有数据值都是10个字符,您将使用前者,如果长度不同,则使用后者。

NVARCHAR可以存储Unicode字符,每个字符需要2个字节。

  • nchar是固定长度的,可以保存Unicode字符。它每个字符使用两个字节的存储。

  • varchar是可变长度的,不能保存Unicode字符。它每个字符使用一个字节存储。

只是澄清一下…或者总结一下…

  • ncharnvarchar可以存储Unicode字符。
  • charvarchar不能存储Unicode字符。
  • charnchar定长,即使您没有用完所有空间,也会为您指定的字符数预留存储空间
  • varcharnvarchar可变长度,它们只会占用您存储的字符的空格。它不会像#EYZ2或nchar那样保留存储空间

ncharnvarchar将占用两倍的存储空间,因此仅在需要Unicode支持时使用它们可能是明智的。

nchar需要更多的空间比 nvarchar。

eg,

一个nchar(100)将始终存储100个字符,即使您只输入5,也会 剩下的95个字符将用空格填充。 在nvarchar(100)中存储5个字符将节省5个字符。

  • char:固定长度的字符数据,最大长度为8000个字符。
  • nchar:固定长度的Unicode数据,最大长度为4000个字符。
  • Char=8位长度
  • NChar=16位长度

的差异是:

  1. n[var]char存储Unicode,而[var]char仅存储单字节字符。
  2. [n]char需要固定数量的确切长度的字符,而[n]varchar接受可变数量的字符,直到并包括定义的长度。

另一个区别是长度。nchar和nvarchar的长度最多可达4,000个字符。char和varchar的长度最多可达8000个字符。但对于SQLServer,您也可以使用[n]varchar(max),最多可处理2,147,483,648个字符。(2 GB,有符号4字节整数。)

添加更多内容: nchar-向数据添加尾随空格。 nvarchar-不向数据添加尾随空格。

因此,如果您要通过“nchar”字段过滤数据集,您可能需要使用RTRIM来删除空格。 例如。 NCHAR(10)字段BRAND存储单词NIKE。 它在单词的右边增加了6个空格。 因此,过滤时,表达式应为: RTRIM(字段!品牌。值)="NIKE"

希望这能帮助到其他人,因为我刚才有点挣扎!

到目前为止的所有答案都表明varchar是单字节,nvarchar是双字节。这个的第一部分实际上是取决于排序规则,如下所示。

DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE  Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)


INSERT INTO @T
VALUES (N'中华人民共和国',N'中华人民共和国'),
(N'abc',N'abc');


SELECT C1,
C2,
LEN(C1)        AS [LEN(C1)],
DATALENGTH(C1) AS [DATALENGTH(C1)],
LEN(C2)        AS [LEN(C2)],
DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM   @T

退货

在此处输入图片描述

请注意,字符在VARCHAR版本中仍然没有表示,而是被?静默替换。

实际上,在该排序规则中仍然没有可以用单字节表示的汉字。唯一的单字节字符是典型的西方ASCII集。

因此,可以从nvarchar(X)列插入到varchar(X)因截断错误而失败(其中X表示两个实例中相同的数字)。

SQLServer 2012添加了支持UTF-16的SC(补充字符)排序规则。在这些排序规则中,单个nvarchar字符可能需要2或4个字节。

我试图总结和纠正现有的答案:

首先,charnchar将始终使用固定量的存储空间,即使要存储的字符串小于可用空间,而varcharnvarchar将仅使用存储该字符串所需的存储空间(加上两个字节的开销,大概用于存储字符串长度)。所以请记住,“var”意味着“变量”,就像在可变空间中一样。

需要理解的第二个要点是,ncharnvarchar使用完全每个字符两个字节来存储字符串,而charvarchar使用由排序规则代码页确定的编码,这将通常正好是每个字符一个字节(尽管也有例外,见下文)。通过使用每个字符两个字节,可以存储非常广泛的字符,因此这里要记住的基本事情是,当你想要国际化支持时,ncharnvarchar往往是更好的选择,你可能会这样做。

现在,对于一些更好的点。

首先,ncharnvarchar总是使用UCS-2存储数据。这意味着每个字符将使用两个字节,并且基本多语言平面(BMP)中的任何Unicode字符都可以通过ncharnvarchar字段存储。但是,不能存储任何 Unicode字符。例如,根据维基百科,埃及象形文字的代码点不属于BMP。因此,有些Unicode字符串可以用UTF-8表示,而其他真正的Unicode编码则不能存储在SQLServerncharnvarchar字段中,其中包括用埃及象形文字编写的字符串。幸运的是,您的用户可能不会在该脚本中编写,但要记住这一点!

其他海报强调的另一个令人困惑但有趣的观点是,如果排序规则代码页面需要,charvarchar字段可能会对某些字符使用每个字符两个字节。(Martin Smith给出了一个很好的例子,他展示了Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS如何表现出这种行为。看看吧。)

更新:从SQLServer 2012开始,终于有了UTF-16的代码页,例如Latin1_General_100_CI_AS_SC,它可以真正覆盖整个Unicode范围。

nchar[(n)](民族性格)

  • 固定长度的Unicode字符串数据。
  • n定义字符串长度,并且必须是1到4,000之间的值。
  • 存储大小是n字节的两倍。

nvarchar [(n | max)](国民性变化。)

  • 可变长度Unicode字符串数据。
  • n定义字符串长度,可以是1到4,000之间的值。
  • max表示最大存储大小为2^31-1字节(2 GB)。
  • 存储大小(以字节为单位)是实际输入数据长度的两倍+2个字节

char [(n)](字符)

  • 固定长度的non-Unicode字符串数据。
  • n定义字符串长度,并且必须是1到8,000之间的值。
  • 存储大小为n字节。

varchar [(n | max)](字符变化)

  • 可变长度,非Unicode字符串数据。
  • n定义字符串长度,可以是1到8,000之间的值。
  • max表示最大存储大小为2^31-1字节(2 GB)。
  • 存储大小是输入数据的实际长度+2个字节。