首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VARCHAR和NVARCHAR的LEN和DATALENGTH

VARCHAR和NVARCHAR的LEN和DATALENGTH
EN

Stack Overflow用户
提问于 2015-06-05 09:31:50
回答 1查看 1.4K关注 0票数 2

在读完"SQL Server中char、nchar、varchar和nvarchar之间有什么区别?“之后,我有一个问题。

我正在使用2008 R2

代码语言:javascript
复制
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  

返回

代码语言:javascript
复制
LEN(C1)     DATALENGTH(C1) LEN(C2)     DATALENGTH(C2)
----------- -------------- ----------- --------------
7           12             7           14

为什么第二个DATALENGTH(C1)是12

EN

回答 1

Stack Overflow用户

发布于 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文本被转换为多字节,一些字符无法在代码页中表示,它们被问号?替换。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30663068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档