SQL Server如何比较两种NCHAR(1)类型?
我正在对SQL Server的数据类型进行一些测试。我有以下代码: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), '啊') >
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路由?