SQL Server中的char,nchar,varchar和nvarchar有什么区别?

nvarchar是什么意思?

SQL Server中的charncharvarcharnvarchar什么区别?

只是为了清理…或者总结一下…

  • ncharnvarchar可以存储Unicode字符。
  • charvarchar 不能存储Unicode字符。
  • charnchar固定长度的 ,即使你没有用完所有的空间 ,它也会为你指定的字符数量保留存储空间。
  • varcharnvarchar可变长度的 ,它只会占用你存储的字符的空格。 它不会保留像charnchar这样的存储

ncharnvarchar将占用两倍的存储空间,因此只有在需要Unicode支持时才可以使用它们。

到目前为止所有的答案都表明, 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版本中仍然没有被表示出来,并被默默地replace成了?

在整理中实际上还没有一个中文字符可以被单个字节所拒绝。 唯一的单字节字符是典型的西方ASCII字符集。

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

SQL Server 2012添加了支持UTF-16 SC(补充字符)sorting规则。 在这些sorting规则中,一个nvarchar字符可能需要2或4个字节。

nchar和char的运行方式与nvarchar和varchar完全相同。 它们之间的唯一区别是nchar / nvarchar存储Unicode字符(如果您需要使用扩展字符集,则是必需的),而varchar不会。

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

这个问题是这个问题的重复。

只是添加更多的东西: nchar – 为数据添加尾随空格。 nvarchar – 不会为数据添加尾随空格。

所以,如果你打算通过'nchar'字段过滤你的数据集,你可能需要使用RTRIM去除空格。 例如,名为BRAND的nchar(10)字段存储单词NIKE。 它在单词的右侧增加了6个空格。 所以,在过滤时,expression式应该是: RTRIM(Fields!BRAND.Value)=“NIKE”

希望这可以帮助到那里的人,因为我刚刚正在为之奋斗一段时间!

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

首先,即使要存储的string小于可用空间, charnchar也将始终使用固定的存储空间量,而varcharnvarchar仅使用存储该string所需的存储空间(加上两个开销字节,可能是为了存储string长度)。 所以记住,“var”的意思是“variables”,就像variables空间一样。

要理解的第二个要点是, ncharnvarchar存储string,每个字符恰好使用两个字节,而charvarchar使用由sorting代码页确定的编码, 通常每个字符只有一个字节(虽然也有例外,见下文)。 通过使用每个字符两个字节,可以存储非常广泛的字符,因此要记住的基本事情是,当您想要国际化支持时, ncharnvarchar往往是一个更好的select,你可能会这样做。

现在有一些更好的点。

首先, ncharnvarchar总是使用UCS-2存储数据。 这意味着每个字符只能使用两个字节,并且基本多语言平面(BMP)中的任何Unicode字符都可以通过ncharnvarchar字段进行存储。 但是, 任何 Unicode字符都不能被存储。 例如,根据维基百科,埃及象形文字的代码点不在BMP之内。 因此,可以用UTF-8和其他真正的Unicode编码表示的Unicodestring不能存储在SQL Server的ncharnvarchar字段中,而用埃及象形文字写的string就是其中之一。 幸运的是,您的用户可能不会写在该脚本中,但是请记住!

另一个令人困惑但有意思的地方是,其他海报强调的是,如果sorting代码页需要它, charvarchar字段可能会为某些字符使用两个字节。 (马丁史密斯给出了一个很好的例子,他展示了Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS是如何performance这种行为的。

更新:自SQL Server 2012起,终于有UTF-16的代码页 ,例如Latin1_General_100_CI_AS_SC,它可以真正覆盖整个Unicode范围。

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

差异是:

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

另一个区别是长度。 nchar和nvarchar都可以长达4000个字符。 char和varchar可以长达8000个字符。 但是对于SQL Server,您也可以使用[n] varchar(max),它最多可以处理2,147,483,648个字符。 (两个千兆字节,一个带符号的4字节整数)

nchar[(n)] (全国性)

  • 固定长度的Unicodestring数据。
  • n定义了string长度,并且必须是从1到4,000的值。
  • 存储大小是n个字节的两倍。

nvarchar [(n | max)] (不同国家的字符)

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

char [(n)] (character)

  • 固定长度的non-Unicodestring数据。
  • n定义了string长度,并且必须是从1到8,000的值。
  • 存储大小是n个字节。

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

  • 可变长度的非Unicodestring数据。
  • n定义string的长度,可以是从1到8,000的值。
  • max表示最大存储大小为2 ^ 31-1字节(2 GB)。
  • 存储大小是input数据的实际长度+ 2个字节。

nchar需要 nvarchar 更多的空间

例如,

即使只input5,字符(100)将始终保存100个字符,其余95个字符将填充空格。 在varchar(100)中存储5个字符将保存5个字符。

通过,

Sunil.ML

nchar(10)是一个长度为10的固定长度的Unicodestring。nvarchar(10)是一个最大长度为10的可变长度的Unicodestring。通常,如果所有数据值都是10个字符,如果长度变化。

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

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

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

CHAR,NCHAR,VARCHAR和NVARCHAR之间的区别?

CHAR:

char [(n)]

  • 存储大小是n个字节。
  • 字符的ISO同义词是字符。

例:

 -- Declare a temporary variable. Declare @text char -- Assign value to temporary variable. Set @text = 'hello' -- Get temporary variable data. Select @text as [Output] 

输出: h

我们得到了h作为输出。 因为我们没有为char指定任何长度。 它将采用默认长度为1

VARCHAR:

varchar [(n | max)]

  • 可变长度的非Unicodestring数据。
  • n定义string的长度,可以是从1到8,000的值。
  • max表示最大存储大小为2 ^ 31-1字节(2 GB)。
  • 存储大小是input数据的实际长度+ 2个字节。
  • varchar的ISO同义词是charvariables或字符变化。

NCHAR:

nchar [(n)]

  • 固定长度的Unicodestring数据。
  • n定义了string长度,并且必须是从1到4,000的值。
  • nchar的ISO同义词是国家字符和国家字符。

NVARCHAR:

nvarchar [(n | max)]

  • 可变长度的Unicodestring数据。
  • n定义string的长度,可以是从1到4,000的值。
  • max表示最大存储大小为2 ^ 31-1字节(2 GB)。
  • nvarchar的ISO同义词是国家字符变化和国家字符变化。

阅读更多关于“CHAR,NCHAR,VARCHAR和NVARCHAR之间的区别? 与例子在这里。