nvarchar是什么意思?
SQL Server中的char、nchar、varchar和nvarchar有什么区别?
只是为了清理…或总结…
- nchar和nvarchar可以存储Unicode字符。
- char和varchar不能存储Unicode字符。
- char和nchar是固定长度,它将为您指定的字符数保留存储空间,即使您没有用尽所有的空间。
- varchar和nvarchar是可变长度,只会占用存储字符的空间。它不会像char或nchar那样保留存储。
nchar和nvarchar将占用两倍的存储空间,因此只有在需要Unicode支持时才使用它们可能是明智的。
- char和varchar并不打算存储unicode,但是使用一些额外的编码技巧和额外的逻辑,您仍然可以将[var]char字段误用为unicode存储。
- 是否n...版本占用的存储空间是我答案所示的两倍,这取决于排序规则。
- 保留存储有什么好处?
- 在最后一个ppoint上:使用unicode nchar和nvarchar在大多数情况下仍然更好,更好的排序,用户的灵活性,消除了未来的兼容性问题。顺便说一句,存储空间在这种情况下不是问题,因为使用不带Unicode的排序规则是一件麻烦的事,而且将来内存率将继续下降。
- 实际上,char/varchar或nchar/nvarchar都不能存储完整的unicode字符范围,因此误导性地说,一个可以存储unicode字符,另一个不能存储。每个字符的固定两个字节编码(SQL Server对nchar和nvarchar使用一种称为ucs-2的编码)不够大,无法覆盖整个unicode范围。详情请参阅我的答案。
- +1如果这些都是真的
- 但是,对于[n]varchar,如果需要,可以存储固定长度的字符串,如varchar(20)。char(20)和varchar(20)有什么区别?
- "bencaine char(20)将使用20个字节(8位assuming安collation);VARCHAR(20)将使用len(数据)+ 2 IU 22字节20字节的数据,但只有12 10个字节的数据。这是额外的双字节长度的记录。如果你的数据始终是全长度,然后用一个char,AS网络保存空间和可能是禁食。请不要永远用varchar(1),或有小A德科工比varchar(4)。在一个单一的varchar字符格式辨别三字节,char(SO(3)将不会使用更多的空间比一个varchar(3)。
- "richardgadsden不会是空字符串varchar(3)空间比内地的IP不安空字符串的字符(3)?2和3字节字节。
- andrewb technically",但你会享受通常有一个空字节,这是全或无的方式。
- 唯一的其他案例我这样做的冰淇淋,当听到两个端口的数据从一个程序(像个ASP.NET Web API)为SQL Server和柱上,你有一个字符的信息网络,你会很容易更新或插入到任何类型的信息流。这是incorrect静止或是说它可能铸造的两个字符的字符串。以"场"stateabbrv char(2)"和public string StateAbbrv {get;set;}在服务器的应用程序。
我在the answers(that is is nvarcharvarchar单字节,双字节。the first part of this as below collation画报depends其实在线。P></
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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 |
归来P></
P></
华that the characters说明和国公社仍然是在varcharversion not the silently和?replaced with)。P></
我不知道中国是there that can be by characters转注,collation单字节。唯一的单字节的ASCII字符集是典型的西方。P></
because of this is possible for an en nvarchar(X)Insert from a column to a varchar(X)column to fail(误差在X与truncation number that is the same denotes在在两个情况下)。P></
SQL Server 2012 adds SC(补锌character),支持UTF-16排序规则。排序规则的字符在这些单nvarchar梅带2或4个字节。P></
- 这是一种寻找答案。两个小时也保存两个我喜欢的非英语文字translates两个"人民共和国"# translate.google.com /汽车/ & hellip;
nchar和char的操作方式几乎完全相同,nvarchar和varchar也是如此。它们之间的唯一区别是nchar/nvarchar存储Unicode字符(如果需要使用扩展字符集,则是必需的),而varchar不存储。
由于Unicode字符需要更多的存储空间,因此nchar/nvarchar字段占用的空间是原来的两倍(例如,在早期版本的SQL Server中,nvarchar字段的最大大小是4000)。
这个问题是这个问题的复制品。
- 你忘了一件事:NChar使用固定的长度,所以NChar(10)总是需要接收10个字符。varchar(10)确实是Unicode的,可以接受任意数量的字符,最多10个字符。另请参阅msdn.microsoft.com/en-us/library/ms186939.aspx
只需添加更多内容:nchar-向数据添加尾随空格。nvarchar-不向数据添加尾随空格。
因此,如果要用"nchar"字段筛选数据集,可能需要使用rtrim来删除空格。例如.NChar(10)一个名为brand的字段存储了单词nike。它在单词的右边加了6个空格。因此,筛选时,表达式应为:rTrm(字段)!brand.value)="耐克"
希望这能帮到别人,因为我刚才有点挣扎!
我attempt to the existing and correct answers:summarizeP></
第一,char总是会使用固定和ncharamount of存储空间,甚至when the string is to be available比存储空间小,只会使用whereas varchar和nvarcharas as is needed to多存储空间(双字节加上字符串的商店,商店的量,presumably to the string length)。我记得,"var"变"均值",as在变量空间。P></
第二点是,了解专业,nchar和nvarchar商店使用确切的说因为是双字节字符的字符串,whereas char和使用安varcharby the code collation encoding矛盾主页,确切的说因为是一usually which will be字节字符(there are消失了,see below)。使用双字节字符的模式,在很宽的范围内存储of characters can be to the Basic的事情,我记得这里that is to be nchar趋势和nvarchar多更好的选择,当你想支持国际化,which You probably给你。P></
现在有些一些细分。P></
第一和nvarcharcolumns,nchar商店使用UCS-2永远日期。this means that will be确切的说因为是双字节字符的Unicode字符在任何使用,和多语言平面(BMP)the Basic can be by an ncharnvarchar场或存储。不管一个人多,is not that the en房屋任何Unicode字符可以存储。for example,the队列根据维基百科,落在埃及的hieroglyphs points for of the BMP。therefore there are,that can be公社,Unicode字符串在Unicode UTF-8和其他encodings true that cannot be stored in ncharSQL服务器场或nvarcharand strings,埃及的摇篮在hieroglyphs written in them。你可能不fortunately用户写在脚本,但它的东西,在我的心灵!P></
另一个兴趣点confusing but that other is that have highlighted char海报和varchar领域可能使用双字节字符代码for if the characters一定collation PAGE EN……。给马丁史密斯(which shows an example中优秀的中国传统_辐射_脑卒中知识_阶_ _ CS _ 100 KS _ exhibits this as _ WS的行为。看看。)P></
更新:as there are of SQL Server 2012年最后的尾巴,pages for example for utf - 16 _ latin1,通用_ 100 _我们_ as _ SC,which can the全部覆盖范围为Unicode。P></
- char:固定长度的字符数据,最大长度为8000个字符。
- nchar:长度固定的Unicode数据,最大长度为4000个字符。
- char=8位长度
- nchar=16位长度
nchar[(n)](民族文字)
- 固定长度的Unicode字符串数据。
- n定义字符串长度,必须是1到4000之间的值。
- 存储大小是n字节的两倍。
nvarchar [(n | max)](民族性变化)
- 长度可变的Unicode字符串数据。
- n定义字符串长度,可以是1到4000之间的值。
- max表示最大存储容量为2^31-1字节(2 GB)。
- 存储大小(以字节为单位)是实际输入数据长度的两倍+2字节
char [(n)](字符)
- 固定长度,non-Unicode字符串数据。
- n定义字符串长度,必须是1到8000之间的值。
- 存储大小为n字节。
varchar [(n | max)](字符变化)
- 可变长度,非Unicode字符串数据。
- n定义字符串长度,可以是1到8000之间的值。
- max表示最大存储容量为2^31-1字节(2 GB)。
- 存储大小是输入数据的实际长度+2字节。
区别在于:
n[var]char存储Unicode,而[var]char只存储单字节字符。
[n]char需要固定长度的字符数,而[n]varchar接受的字符数不超过并包括定义的长度。
另一个区别是长度。NChar和nvarchar的长度都可以达到4000个字符。char和varchar的长度可以达到8000个字符。但是对于SQL Server,您也可以使用[N]varchar(max),它最多可以处理2147483648个字符。(2GB,有符号的4字节整数。)
NChar比nvarchar需要更多的空间。
如,
一个字符(100)将始终存储100个字符,即使只输入5个字符,剩下的95个字符将用空格填充。在varchar(100)中存储5个字符将节省5个字符。
- 不完全的威胁,因为你是一个需要两个填充字符(100)与IP的两个人物。你会使用这个当你再大橡树numbers'在你的数据库,或阶数与一个固定的长度。因为这场长度固定,你有没有选择两个填充它的IP号码的两个最大的特点。但当你所有的数据记录的100个人物冰每一字符(100)将以较小的存储比A varchar(100),因为它不需要一个length值显示:每一个人物的到底会是100。
NChar(10)是长度为10的固定长度Unicode字符串。nvarchar(10)是长度可变的Unicode字符串,最大长度为10。通常,如果所有数据值都是10个字符,则使用前者;如果长度不同,则使用后者。
- 错误的比较-问题与nchar和varchar有关,而不是nchar和nvarchar。
- 错了。Unicode可以为每个字符使用1到4个字节(通常)。此外,varchar可以保存unicode,但不能识别为unicode。因此,varchar对于unicode存储来说是不可靠的。(尤其是因为访问字段的代码可能会错误地翻译它。)
- @亚历克斯:我想你说得对,但我还是不同意你的观点。你要说的是,如果一个整型数恰好小于2^32,它就可以保持一个整型数。这不仅是"不可靠的",而且是一个固有的限制,使得它不可能覆盖整个值范围。
- @亚历克斯:错了。编码为UCS-2的Unicode(恰好是SQL Server使用的编码)将每个字符存储在两个字节中,请参阅msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx‌&8203;:SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)。SQL Server 2008可以使用SCSU压缩,但仍然压缩ucs-2编码的unicode字符串:msdn.microsoft.com/en-us/library/ee240835.aspx
nvarchar可以存储Unicode字符,每个字符占用2个字节。
- 错了!Unicode每个字符使用1到4个字节!很多人忘记了这一点!即使使用UTF-16,也可能导致某些字符占用4个字节而不是2个字节,尽管公共长度为2个字节。Unicode的某些其他子格式可能需要超过4个字节!
- @Wimtenbrink——问题是关于SQL Server,nvarchar总是每个字符占用2个字节。
- @WIM,你是正确的,有几个Unicode编码可以产生不同的字节数。但SQL Server不提供有关Unicode编码的选择。2012年之前的SQL Server只使用了两个字节宽的ucs-2,所以Martin在写答案时是正确的。正如上面提到的其他答案,SQLServer2012现在提供了UTF-16,因此许多字符(Unicode基本多语言平面中的字符)有两个字节,其他字符有四个字节。