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

713

nvarchar 是什么意思?

charncharvarcharnvarchar 在 SQL Server 中有什么区别?

12个回答

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

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


错误。Unicode 可以使用 1 到 4 个字节(通常情况下)表示每个字符。此外,varchar 可以容纳 Unicode,但它不被认为是 Unicode。因此,varchar 被认为是不可靠的 Unicode 存储方式。(特别是因为存在访问该字段的代码可能会将其翻译错误的风险。) - Wim ten Brink
@Alex:我认为你已经表达了你的观点,但我仍然不同意你的看法。你所说的是,如果long比2^32小,那么int可以容纳long。这不仅是“不可靠”的,而且是一种固有的限制,使得它无法覆盖整个值范围。 - Manu
4
@Workshop Alex: 错误。Unicode编码为UCS-2(这也是SQL Server使用的编码方式),每个字符都恰好存储在两个字节中,参见http://msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx:“SQL Server使用UCS-2编码方案存储Unicode...UCS-2是一种固定长度编码,将所有字符表示为16位值(2个字节)”。SQL Server 2008可以使用SCSU压缩,但仍然是对UCS-2编码的Unicode字符串进行压缩:http://msdn.microsoft.com/en-us/library/ee240835.aspx - Remus Rusanu

2

NVARCHAR可以存储Unicode字符,每个字符占用2个字节。


1
错误!Unicode每个字符使用1到4个字节!许多人忘记了这一点!即使使用UTF-16,某些字符可能需要4个字节而不是2个字节,尽管通常长度为2个字节。某些其他的Unicode子格式可能需要超过4个字节! - Wim ten Brink
8
这个问题涉及到SQL Server,nvarchar类型始终每个字符占用2个字节。 - Martin Smith
1
@Wim,你说得对,Unicode有几种编码方式可以产生不同数量的字节。但是SQL Server并不允许你选择Unicode编码方式。在2012年之前,SQL Server只使用UCS-2编码,每个字符占两个字节,所以Martin在他写答案时是正确的。正如其他回答中所说,SQL Server 2012现在提供UTF-16编码,因此对于许多字符(Unicode基本多语言平面中的字符),占用两个字节,而对于其他字符则占用四个字节。 - Concrete Gannet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接