我的问题是基于观察到针对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?