Sql server nvarchar是否总是将每个字符存储在两个字节中?

Sql server nvarchar是否总是将每个字符存储在两个字节中?,sql-server,unicode,Sql Server,Unicode,我(可能是天真地)假设在SQL Server中,nvarchar将每个字符存储在两个字节中。但情况似乎并非总是如此。那里的文档表明,某些字符可能需要更多字节。有人有明确的答案吗?有,它使用2个字节,使用datalength获取存储大小,您不能使用LEN,因为LEN只计算字符数,请参见此处: 以下是网上书籍的内容: 字符数据类型是 固定长度、nchar或 可变长度,nvarchar,Unicode 数据并使用UNICODE UCS-2 字符集 nchar[(n)] 固定长度Unicode n个字符

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

有,它使用2个字节,使用datalength获取存储大小,您不能使用LEN,因为LEN只计算字符数,请参见此处:

以下是网上书籍的内容:

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

nchar[(n)]

固定长度Unicode n个字符的字符数据。必须 为1到4000之间的值。这个 存储大小是n字节的两倍。这个 nchar的ISO同义词是国家标准 性格和民族性格

nvarchar[(n|max)]

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

也就是说,unicode压缩是在SQLServer2008R2中引入的,所以它可能将ascii存储为1字节,您可以在这里阅读有关unicode压缩的内容


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


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

我对这个问题的理解是SQL Server在内部使用UCS-2,但是它的UCS-2实现已经被黑客攻击以支持,它们被存储为UCS-2,但在查询时被数据库引擎透明地转换回多字节字符


代理/补充字符不完全受支持-许多SQL server字符串函数的实现不支持代理对,详情如下。

有趣的是-从我在网上看到的其他事情来看,他们提到SQL server使用UCS-2存储文本。那么你是说一个nvarchar字符可能需要4个字节?当然,但这是bog标准字母。在SQL Server的UCS-2实现中,是否有时会将其存储为4个字符以表示不太常见的字符?例如,在本文中,它说“因为UCS-2只允许编码65536个不同的代码点,所以它不以本机方式处理补充字符,而是将补充字符视为一对未定义的Unicode代理字符,当这些字符配对在一起时,将定义一个补充字符。”,我从未见过它使用超过2个字符…可能那些不太常见的字符无法存储…你有一个例子吗…将它粘贴到代码中,看看你得到了什么我最初的困惑出现了,因为我看到有人在博客上说他们在一个表上使用了sp_spaceUse,出于某种原因,当他们使用的是nvarchar,而不是varchar。这可能是由于更多的页面或其他此类非数据gumf占用了额外的大小?sp_spaceused还显示了可用空间和非聚集索引空间。此外,如果表是分段的,则会占用更多空间>可以存储2字节字符(尽管它们在内部作为UCS-2保存)-请参阅我的答案中的GB18030链接
DECLARE @n NVARCHAR(10)
DECLARE @v VARCHAR(10)

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

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

---------
2 1