varchar()和nvarchar()之间奇怪的SQL Server 2005排序差异

时间:2010-06-16 20:35:07

标签: sql-server-2005 tsql unicode collation nvarchar

有人可以解释一下:

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()排序按预期发生。

(我的原始查询使用''N''字面语法来区分varchar()nvarchar()而不是CAST()并获得相同的结果。)< / p>

数据库的整理设置为SQL_Latin1_General_CP1_CI_AS

2 个答案:

答案 0 :(得分:9)

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

比较-XiX,就像比较XiX一样,左侧的-X更大。 当比较“ - ”和“i”时,就像比较“”和“i”,所以“i”,右侧更大。

来自MSDN,

  

SQL排序规则的排序规则   非Unicode数据与。不兼容   由...提供的任何排序例程   Microsoft Windows操作系统   系统;然而,排序   Unicode数据与a兼容   特定版本的Windows   排序规则。因为比较   非Unicode和Unicode数据的规则   当你使用SQL时,它们是不同的   整理你可能会看到不同   比较结果   字符,取决于   基础数据类型。例如,如果   您正在使用SQL排序规则   “SQL_Latin1_General_CP1_CI_AS”,.   非Unicode字符串'a-c'小于   字符串'ab',因为连字符   (“ - ”)作为单独的分类   在“b”之前出现的字符。   但是,如果您转换这些字符串   到Unicode并执行相同的操作   比较,Unicode字符串N'a-c'   被认为大于N'ab'   因为Unicode排序规则使用   忽略连字符的“单词排序”。

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

答案 1 :(得分:1)

一个很好的问题!

四处搜寻,我发现这个问题与连字符和撇号有关。您的示例与'''X'表现出与'-X'相同的'奇怪'行为。

我找不到答案,因为它在这里: SQL Sorting and hyphens