nvarchar是什么意思?
nvarchar
SQL服务器中的char、nchar、varchar和nvarchar有什么区别?
char
nchar
varchar
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字符。它每个字符使用一个字节存储。
只是澄清一下…或者总结一下…
nchar和nvarchar将占用两倍的存储空间,因此仅在需要Unicode支持时使用它们可能是明智的。
nchar需要更多的空间比 nvarchar。
eg,
一个nchar(100)将始终存储100个字符,即使您只输入5,也会 剩下的95个字符将用空格填充。 在nvarchar(100)中存储5个字符将节省5个字符。
Char
NChar
的差异是:
另一个区别是长度。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版本中仍然没有表示,而是被?静默替换。
华
国
VARCHAR
?
实际上,在该排序规则中仍然没有可以用单字节表示的汉字。唯一的单字节字符是典型的西方ASCII集。
因此,可以从nvarchar(X)列插入到varchar(X)列因截断错误而失败(其中X表示两个实例中相同的数字)。
nvarchar(X)
varchar(X)
SQLServer 2012添加了支持UTF-16的SC(补充字符)排序规则。在这些排序规则中,单个nvarchar字符可能需要2或4个字节。
UTF-16
我试图总结和纠正现有的答案:
首先,char和nchar将始终使用固定量的存储空间,即使要存储的字符串小于可用空间,而varchar和nvarchar将仅使用存储该字符串所需的存储空间(加上两个字节的开销,大概用于存储字符串长度)。所以请记住,“var”意味着“变量”,就像在可变空间中一样。
需要理解的第二个要点是,nchar和nvarchar使用完全每个字符两个字节来存储字符串,而char和varchar使用由排序规则代码页确定的编码,这将通常正好是每个字符一个字节(尽管也有例外,见下文)。通过使用每个字符两个字节,可以存储非常广泛的字符,因此这里要记住的基本事情是,当你想要国际化支持时,nchar和nvarchar往往是更好的选择,你可能会这样做。
现在,对于一些更好的点。
首先,nchar和nvarchar列总是使用UCS-2存储数据。这意味着每个字符将使用两个字节,并且基本多语言平面(BMP)中的任何Unicode字符都可以通过nchar或nvarchar字段存储。但是,不能存储任何 Unicode字符。例如,根据维基百科,埃及象形文字的代码点不属于BMP。因此,有些Unicode字符串可以用UTF-8表示,而其他真正的Unicode编码则不能存储在SQLServernchar或nvarchar字段中,其中包括用埃及象形文字编写的字符串。幸运的是,您的用户可能不会在该脚本中编写,但要记住这一点!
其他海报强调的另一个令人困惑但有趣的观点是,如果排序规则代码页面需要,char和varchar字段可能会对某些字符使用每个字符两个字节。(Martin Smith给出了一个很好的例子,他展示了Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS如何表现出这种行为。看看吧。)
更新:从SQLServer 2012开始,终于有了UTF-16的代码页,例如Latin1_General_100_CI_AS_SC,它可以真正覆盖整个Unicode范围。
nchar[(n)](民族性格)
nchar[(n)]
n
nvarchar [(n | max)](国民性变化。)
nvarchar [(n | max)]
max
char [(n)](字符)
char [(n)]
non-Unicode
varchar [(n | max)](字符变化)
varchar [(n | max)]