5

有人可以解释一下吗:

SELECT 
  CASE WHEN CAST('iX' AS nvarchar(20)) 
      > CAST('-X' AS nvarchar(20)) THEN 1 ELSE 0 END,
  CASE WHEN CAST('iX' AS varchar(20)) 
      > CAST('-X' AS varchar(20)) THEN 1 ELSE 0 END

结果: 0 1

SELECT 
  CASE WHEN CAST('i' AS nvarchar(20)) 
      > CAST('-' AS nvarchar(20)) THEN 1 ELSE 0 END,
  CASE WHEN CAST('i' AS varchar(20)) 
      > CAST('-' AS varchar(20)) THEN 1 ELSE 0 END

结果: 1 1

在第一个查询中,nvarchar()结果不是我所期望的,但删除X使nvarchar()排序按预期发生。

(我最初的查询使用''andN''文字语法来区分varchar()andnvarchar()而不是CAST()得到相同的结果。)

数据库的排序规则设置为SQL_Latin1_General_CP1_CI_AS.

4

2 回答 2

9

在比较 unicode 文本时,连字符会被特殊处理。Unicode 比较使用“字典顺序”,它忽略连字符。非 unicode 文本比较不是这种情况。

比较-Xand iX, 就像比较Xand iX, 所以-X, 左边, 更大。当比较“-”和“i”时,就像比较“”和“i”一样,所以“i”,右边更大。

来自 MSDN,

SQL 排序规则用于对非 Unicode 数据进行排序的规则与 Microsoft Windows 操作系统提供的任何排序例程都不兼容;但是,Unicode 数据的排序与特定版本的 Windows 排序规则兼容。由于非 Unicode 和 Unicode 数据的比较规则不同,因此当您使用 SQL 排序规则时,您可能会看到相同字符的比较结果不同,具体取决于基础数据类型。例如,如果您使用 SQL 排序规则“SQL_Latin1_General_CP1_CI_AS”,则非 Unicode 字符串“ac”小于字符串“ab”,因为连字符 (“-”) 被排序为位于“b”之前的单独字符. 然而,

SELCT body From MSDN_Articles WHERE url IN(“ http://support.microsoft.com/kb/322112 ”)

于 2010-06-16T21:09:24.053 回答
1

一个很好的问题!

挖掘了一下,我发现这个问题与连字符和撇号有关。您的示例使用“-X”表现出与“-X”相同的“奇怪”行为。

我不能因为找到答案而受到赞扬,因为它就在这里: SQL Sorting and hyphens

于 2010-06-16T21:21:18.483 回答