nvarchar总是将每个字符存储在两个字节中吗?

Ric*_*ich 11 sql-server unicode

我(或许天真)认为在SQL Server中,nvarchar会将每个字符存储在两个字节中.但情况似乎并非总是如此.那里的文档表明某些字符可能需要更多的字节.有人有明确的答案吗?

SQL*_*ace 16

是的,它使用2个字节,使用datalength来获取存储大小,你不能使用LEN因为LEN只计算字符,请看这里:SQL Server中LEN和DATALENGTH之间的差异

DECLARE @n NVARCHAR(10)
DECLARE @v VARCHAR(10)

SELECT @n = 'A', @v='A'

SELECT  DATALENGTH(@n),DATALENGTH(@v)

---------
2 1
Run Code Online (Sandbox Code Playgroud)

以下是Books On Line的内容:http://msdn.microsoft.com/en-us/library/ms186939.aspx

字符数据类型,包括固定长度,nchar或可变长度,nvarchar,Unicode数据,并使用UNICODE UCS-2字符集.

nchar [(n)]

n个字符的固定长度Unicode字符数据.n必须是1到4,000之间的值.存储大小是n个字节的两倍.nchar的ISO同义词是国家字符和国家字符.

nvarchar [(n | max)]

可变长度的Unicode字符数据.n可以是1到4,000之间的值.max表示最大存储大小为2 ^ 31-1个字节.存储大小(以字节为单位)是输入字符数+ 2字节的两倍.输入的数据长度可以是0个字符.nvarchar的ISO同义词是国家字符变化和国家字符变化.

那说在SQL Server 2008 R2中引入了unicode压缩,所以它可能将ascii存储为1个字节,你可以在这里阅读unicode压缩


Jör*_*tag 5

鉴于字符数超过 65536 个,显然一个字符不可能只容纳两个八位字节(即 16 位)。

SQL Server 与大多数 Microsoft 产品(Windows、.NET、NTFS 等)一样,使用 UTF-16 来存储文本,其中一个字符占用两个或四个八位字节,尽管 @SQLMenace 指出,当前版本的 SQL Server使用压缩来减少这种情况。