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