nvarchar是什么意思?

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


当前回答

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

首先,char和nchar将总是使用固定数量的存储空间,即使要存储的字符串小于可用空间,而varchar和nvarchar将只使用存储该字符串所需的存储空间(加上两个字节的开销,假定用于存储字符串长度)。记住,var的意思是变量,就像在变量空间里一样。

The second major point to understand is that, nchar and nvarchar store strings using exactly two bytes per character, whereas char and varchar use an encoding determined by the collation code page, which will usually be exactly one byte per character (though there are exceptions, see below). By using two bytes per character, a very wide range of characters can be stored, so the basic thing to remember here is that nchar and nvarchar tend to be a much better choice when you want internationalization support, which you probably do.

现在来看一些细节。

First, nchar and nvarchar columns always store data using UCS-2. This means that exactly two bytes per character will be used, and any Unicode character in the Basic Multilingual Plane (BMP) can be stored by an nchar or nvarchar field. However, it is not the case that any Unicode character can be stored. For example, according to Wikipedia, the code points for Egyptian hieroglyphs fall outside of the BMP. There are, therefore, Unicode strings that can be represented in UTF-8 and other true Unicode encodings that cannot be stored in a SQL Server nchar or nvarchar field, and strings written in Egyptian hieroglyphs would be among them. Fortunately your users probably don't write in that script, but it's something to keep in mind!

另一个令人困惑但有趣的观点是,如果排序代码页要求的话,char和varchar字段可能会为每个字符使用两个字节。(Martin Smith给出了一个很好的例子,他展示了Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS如何展示这种行为。看看吧。)

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

其他回答

Nchar和char的操作方式几乎完全相同,nvarchar和varchar也是如此。它们之间唯一的区别是nchar/nvarchar存储Unicode字符(如果你需要使用扩展字符集,这是必不可少的),而varchar不存储。

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

这个问题是这个问题的翻版。

Nchar比nvarchar需要更多的空间。

eg,

一个nchar(100)将始终存储100个字符,即使你只输入5 剩下的95个字符将用空格填充。 在nvarchar(100)中存储5个字符将节省5个字符。

区别在于:

N [var]char存储unicode,而[var]char仅存储单字节字符。 [n]char需要固定长度的字符数,而[n]varchar接受可变长度的字符数,直到并包括定义的长度。

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

Nchar [(n)](民族字符)

固定长度的Unicode字符串数据。 N定义了字符串长度,必须是1到4000之间的值。 存储大小为2倍n字节。


Nvarchar [(n | max)](民族特征变化。)

可变长度的Unicode字符串数据。 N定义了字符串长度,取值范围为1到4000。 max表示最大存储空间为2^31-1字节(2gb)。 存储大小(以字节为单位)是实际输入数据长度的两倍+ 2字节


字符[(n)]

固定长度的非unicode字符串数据。 N定义了字符串长度,必须是1到8000之间的值。 存储大小为n字节。


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

可变长度、非unicode字符串数据。 N定义了字符串长度,可以是1到8000之间的值。 max表示最大存储空间为2^31-1字节(2gb)。 存储大小为输入数据的实际长度+ 2字节。

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