在读完"SQL Server中char、nchar、varchar和nvarchar之间有什么区别?“之后,我有一个问题。
我正在使用2008 R2
DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)
INSERT INTO @T VALUES (N'中华人民共和国',N'中华人民共和国')
SELECT LEN(C1) AS [LEN(C1)],
DATALENGTH(C1) AS [DATALENGTH(C1)],
LEN(C2) AS [LEN(C2)],
DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM @T 返回
LEN(C1) DATALENGTH(C1) LEN(C2) DATALENGTH(C2)
----------- -------------- ----------- --------------
7 12 7 14为什么第二个DATALENGTH(C1)是12
发布于 2015-06-05 12:06:53
在您的INSERT中,您将文本从unicode转换为用于C1的中文代码页。这个过程很可能会改变文本,有些东西可能会丢失。
这是SQL Fiddle。
您可以看到第二个字符华以3F的形式存储在varchar中。您还可以看到,最后一个字符国也以3F的形式存储在varchar中。3F是?的代码。当Windows试图将文本从unicode转换为代码页,并且某些字符不能在给定的代码页中表示时,转换函数(很可能是WideCharToMultiByte)会为这些字符放置?。
再举一个例子。最后一个字符和在varchar中编码为A94D,在nvarchar中编码为8C54。如果您在字符映射中查找它,它将显示以下代码(unicode和代码页):

另请参阅:
https://www.microsoft.com/middleeast/msdn/Questionmark.aspx
任何时候必须显示Unicode数据时,都可以使用WideCharToMultiByte API从Unicode内部转换它们。当某个字符无法在当前代码页上表示时,它将被问号(?)替换。
这正是在将unicode文本N'中华人民共和国'存储在varchar列中时所发生的事情。unicode文本被转换为多字节,一些字符无法在代码页中表示,它们被问号?替换。
https://stackoverflow.com/questions/30663068
复制相似问题