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

时间:2011-01-17 13:22:40

标签: sql-server unicode

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

3 个答案:

答案 0 :(得分:15)

是的,它使用2个字节,使用datalength来获取存储大小,你不能使用LEN因为LEN只计算字符,请看这里:The differences between LEN and DATALENGTH in SQL Server

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

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

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

---------
2 1

以下是图书在线的内容:http://msdn.microsoft.com/en-us/library/ms186939.aspx

  

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

     

nchar [(n)]

     

固定长度的Unicode   n个字符的字符数据。必须   是1到4,000之间的值。该   存储大小是n个字节的两倍。该   ISO的同义词nchar是national   char和民族性。

     

nvarchar [(n | max)]

     

可变长度的Unicode字符   数据。 n 可以是1到1之间的值   4000。 max表示最大值   存储大小为2 ^ 31-1个字节。该   存储大小(以字节为单位)是两倍   输入的字符数+ 2   字节。输入的数据可以是0   字符的长度。 ISO同义词   对于nvarchar来说,国家炭不同   和民族性格不同。

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

答案 1 :(得分:4)

鉴于有超过65536个字符,很明显一个字符不可能只适合两个八位字节(即16位)。

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

答案 2 :(得分:4)

我对此问题的理解是SQL Server在内部使用UCS-2,但其UCS-2实现已被黑客攻击以支持a subset of characters of up to 4 bytes in the GB18030 character set,它们存储为UCS-2但由数据库透明转换查询时引擎返回多字节字符。

不完全支持代理/补充字符 - 许多SQL服务器字符串函数的实现不支持代理对,详见here