【发布时间】:2011-06-10 11:03:29
【问题描述】:
我曾经(也许是天真地)假设在 SQL Server 中,nvarchar 会将每个字符存储在两个字节中。但情况似乎并非总是如此。那里的文档表明某些字符可能需要更多字节。有人有明确的答案吗?
【问题讨论】:
标签: sql-server unicode
我曾经(也许是天真地)假设在 SQL Server 中,nvarchar 会将每个字符存储在两个字节中。但情况似乎并非总是如此。那里的文档表明某些字符可能需要更多字节。有人有明确的答案吗?
【问题讨论】:
标签: sql-server unicode
是的,它使用 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 个字符的字符数据。 n 必须 是从 1 到 4,000 的值。这 存储大小是 n 字节的两倍。这 nchar 的 ISO 同义词是国家的 字符和国家字符。
nvarchar [ ( n | max ) ]
可变长度 Unicode 字符 数据。 n 可以是从 1 到 4,000。 max 表示最大值 存储大小为 2^31-1 字节。这 存储大小(以字节为单位)是两倍 输入的字符数 + 2 字节。输入的数据可以为0 个字符的长度。 ISO 同义词 对于 nvarchar 是国家字符变化 和民族性格不同。
也就是说 unicode 压缩是在 SQL Server 2008 R2 中引入的,因此它可能会将 ascii 存储为 1 个字节,您可以在此处阅读有关 unicode 压缩的信息
【讨论】:
鉴于有超过 65536 个字符,很明显一个字符不可能只容纳两个八位字节(即 16 位)。
SQL Server 与大多数 Microsoft 产品(Windows、.NET、NTFS 等)一样使用 UTF-16 存储文本,其中一个字符占用两个或四个八位字节,尽管正如 @SQLMenace 指出的那样,当前版本的 SQL Server 使用压缩来减少这种情况。
【讨论】:
我对这个问题的理解是,SQL server 内部使用的是 UCS-2,但是它的 UCS-2 实现已经被破解以支持a subset of characters of up to 4 bytes in the GB18030 character set,它被存储为 UCS-2 但被数据库引擎透明地转换回来查询时转换为多字节字符。
不完全支持代理/补充字符 - 许多 SQL 服务器字符串函数的实现不支持代理对,详细信息 here。
【讨论】: