代码之家  ›  专栏  ›  技术社区  ›  richardtallent

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

  •  5
  • richardtallent  · 技术社区  · 15 年前

    有人能解释一下吗:

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

    (我最初的查询使用 '' N'' 要区分的文本语法 varchar() nVARCARCH() 而不是 CAST() 得到了同样的结果。)

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

    2 回复  |  直到 15 年前
        1
  •  9
  •   mdma    15 年前

    在比较Unicode文本时,对连字符进行特殊处理。Unicode比较使用“字典顺序”,忽略连字符。这不是非Unicode文本比较的情况。

    比较 -X iX ,就像比较 X 如此 -X 左边,更大。 当比较“-”和“i”时,就像比较“”和“i”,所以“i”的右边更大。

    来自MSDN,

    用于排序的SQL排序规则 非Unicode数据与不兼容 由提供的任何排序例程 Microsoft Windows操作系统 系统;但是,分类 Unicode数据与 特定版本的Windows 排序规则。因为比较 非Unicode和Unicode数据的规则 是不同的,当使用SQL时 排序规则您可能会看到不同的 相同的比较结果 字符,取决于 基础数据类型。例如,如果 您正在使用SQL排序规则 “SQL拉丁1_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 “”

        2
  •  1
  •   Community CDub    8 年前

    一个好问题!

    仔细研究后,我发现这个问题与连字符和撇号有关。您的示例显示了与“'x”和“-x”相同的“奇怪”行为。

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

    推荐文章