SQL Server中的char,nchar,varchar和nvarchar有什么区别?
nvarchar
是什么意思?
SQL Server中的char
, nchar
, varchar
和nvarchar
什么区别?
只是为了清理…或者总结一下…
-
nchar
和nvarchar
可以存储Unicode字符。 -
char
和varchar
不能存储Unicode字符。 -
char
和nchar
是固定长度的 ,即使你没有用完所有的空间 ,它也会为你指定的字符数量保留存储空间。 -
varchar
和nvarchar
是可变长度的 ,它只会占用你存储的字符的空格。 它不会保留像char
或nchar
这样的存储 。
nchar
和nvarchar
将占用两倍的存储空间,因此只有在需要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小于可用空间, char
和nchar
也将始终使用固定的存储空间量,而varchar
和nvarchar
仅使用存储该string所需的存储空间(加上两个开销字节,可能是为了存储string长度)。 所以记住,“var”的意思是“variables”,就像variables空间一样。
要理解的第二个要点是, nchar
和nvarchar
存储string,每个字符恰好使用两个字节,而char
和varchar
使用由sorting代码页确定的编码, 通常每个字符只有一个字节(虽然也有例外,见下文)。 通过使用每个字符两个字节,可以存储非常广泛的字符,因此要记住的基本事情是,当您想要国际化支持时, nchar
和nvarchar
往往是一个更好的select,你可能会这样做。
现在有一些更好的点。
首先, nchar
和nvarchar
列总是使用UCS-2存储数据。 这意味着每个字符只能使用两个字节,并且基本多语言平面(BMP)中的任何Unicode字符都可以通过nchar
或nvarchar
字段进行存储。 但是, 任何 Unicode字符都不能被存储。 例如,根据维基百科,埃及象形文字的代码点不在BMP之内。 因此,可以用UTF-8和其他真正的Unicode编码表示的Unicodestring不能存储在SQL Server的nchar
或nvarchar
字段中,而用埃及象形文字写的string就是其中之一。 幸运的是,您的用户可能不会写在该脚本中,但是请记住!
另一个令人困惑但有意思的地方是,其他海报强调的是,如果sorting代码页需要它, char
和varchar
字段可能会为某些字符使用两个字节。 (马丁史密斯给出了一个很好的例子,他展示了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位长度
差异是:
- n [var] char存储unicode,而[var] char只存储单字节字符。
- [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-Unicode
string数据。 -
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之间的区别? 与例子在这里。