SQL Server如何比较两种NCHAR(1)类型?

SQL Server如何比较两种NCHAR(1)类型?,sql,sql-server,string,unicode,sqldatatypes,Sql,Sql Server,String,Unicode,Sqldatatypes,我正在对SQL Server的数据类型进行一些测试。我有以下代码: IF CONVERT(NCHAR(1), '啊') > CONVERT(NCHAR(1), '哎') SELECT '>'; ELSE SELECT '<'; SELECT '<' WHERE CONVERT(NCHAR(1), '啊') < CONVERT(NCHAR(1), '哎'); SELECT '>' WHERE CONVERT(NCHAR(1), '啊') >

我正在对SQL Server的数据类型进行一些测试。我有以下代码:

IF CONVERT(NCHAR(1), '啊') > CONVERT(NCHAR(1), '哎')
    SELECT '>';
ELSE
    SELECT '<';

SELECT '<' WHERE CONVERT(NCHAR(1), '啊') < CONVERT(NCHAR(1), '哎');
SELECT '>' WHERE CONVERT(NCHAR(1), '啊') > CONVERT(NCHAR(1), '哎');
如果转换(NCHAR(1),'啊') > 转换(NCHAR(1),'哎')
选择“>”;
其他的

在编写代码时,在代码中选择“,您忽略了一种可能性:两个值相等。事实证明,这就是发生的情况。下面是一个小代码:

SELECT '=' WHERE CONVERT(NCHAR(1), '啊') = CONVERT(NCHAR(1), '哎');

SELECT UNICODE(CONVERT(NCHAR(1), '啊')), 
   UNICODE(CONVERT(NCHAR(1), '哎')), 
   NCHAR(UNICODE(CONVERT(NCHAR(1), '哎')));

第一个选择显示这两个值确实相等,第二个选择显示原因。具体来说,如果字符串文本中没有
N
前缀,SQL将它们视为ASCII表示“它们超出了ASCII的范围!”并返回一个文字问号。

在您编写的代码中,您忽略了一种可能性:两个值相等。事实证明,这就是正在发生的情况。下面是一个小代码:

SELECT '=' WHERE CONVERT(NCHAR(1), '啊') = CONVERT(NCHAR(1), '哎');

SELECT UNICODE(CONVERT(NCHAR(1), '啊')), 
   UNICODE(CONVERT(NCHAR(1), '哎')), 
   NCHAR(UNICODE(CONVERT(NCHAR(1), '哎')));

第一个选择显示这两个值确实相等,第二个选择显示原因。具体来说,如果字符串文本中没有
N
前缀,SQL将它们视为ASCII表示“它们超出了ASCII的范围!”并返回一个文字问号。

字符串前面缺少N前缀literals@MartinSmith,是的,Martin,我知道,我只想知道SQL Server将如何处理此情况。它很可能会将所有内容转换为?最有可能。这取决于您的默认代码页以及它是否包含这些字符。基本上啊' 是varchar类型,SQL Server将如何从varchar转换为nchar?即使它被转换为
,它仍然有一些值且不为空。那么为什么if比较总是转到ELSE路由?字符串前缺少N前缀literals@MartinSmith,是的,Martin,我知道,我只是想知道SQL Server将如何处理这种情况。它很可能会将所有内容转换为?取决于您的默认代码页以及它是否包含这些字符。本质上是啊' 是varchar类型,SQL Server将如何从varchar转换为nchar?即使它被转换为
,它仍然有一些值且不为空。那么为什么if比较总是转到ELSE路由?