为什么在N前缀字符串会给出不同的代码

时间:2018-02-27 13:30:35

标签: sql-server unicode encoding

我的问题是基于观察到针对SQL Server 2014运行的以下查询的结果。

select convert(varbinary(200), 'A')

-------------------------------------
0x41

select convert(varbinary(200), N'A')

-------------------------------------
0x4100

select convert(varbinary(200), 'ஆ')

-------------------------------------
0x3F

select convert(varbinary(200), N'ஆ')

-------------------------------------
0x860B

字符'ஆ'是从互联网上复制的。

当使用N前缀查询时,为什么“ஆ”的代码不同?

这是因为SQL Server默认使用的代码页的代码点为0x3F,用于'ஆ'吗?

查询在我的框中的SSMS中运行(与sql框不同)。 SSMS如何设法将'ஆ'和N''之间的区别传达给SQL Server?

修改

WITHOUT N前缀的文本是非unicode,N前缀的文本是unicode吗?如果是这样,为什么下面的select '晥'声明会返回'?'?

'晥'的unicode代码点是0x6566(如下所示)

select convert(varbinary(10), N'晥')
----------------------
0x6566

现在,当将该代码点解释为varchar(非unicode)时,我得到'ef'(因为65和66是默认代码页中这些字符的代码点)。

declare @c varbinary(10) = 0x6566
select convert(varchar(10), @c)
----------
ef

但为什么我会'?'这样做的时候? (它不应该被解释为varchars,因为缺少N前缀?

select '晥'
----
?

修改

我知道由于SQL服务器无法将unicode代码点0x6566映射到默认代码页上的代码点而返回'?'。但它是如何从语句select '晥'知道引号中的文本流必须被解释为unicode尽管缺少N?

0 个答案:

没有答案