代码之家  ›  专栏  ›  技术社区  ›  TheSoftwareJedi jac

导致SQLServer2005字符串比较出现问题的Unicode字符

  •  4
  • TheSoftwareJedi jac  · 技术社区  · 16 年前

    此查询:

    select *
    from op.tag
    where tag = 'fussball'
    

    返回标记列值为“fuball”的结果。“tag”列定义为nvarchar(150)。

    虽然我知道他们是 similar words grammatically

    跟进加分问题。解释此查询不返回任何行的原因:

    select 1 
    where 'fußball' = 'fussball'
    

    额外问题(答案?):@scotcher私下向我指出,这是由于字符串文字“fussball”被视为varchar。此查询确实返回一个结果:

    select 1 
    where 'fußball' = cast('fussball' as nvarchar)
    

    但话说回来,这个没有:

    select 1 
    where cast('fußball' as varchar) = cast('fussball' as varchar)
    

    我很困惑。

    5 回复  |  直到 16 年前
        1
  •  3
  •   TheSoftwareJedi jac    16 年前

    我猜连接/表/数据库的Unicode排序规则集指定ss==。后一种行为可能是因为它在错误的快速路径上,或者它进行了二进制比较,或者您没有以正确的编码传递(我同意这是愚蠢的)。

    http://unicode.org/reports/tr10/#Searching 提到U+00DF是特殊情况。以下是一段有见地的摘录:

    语言敏感搜索和 匹配与 整理。比较为 在某种力量水平上是相等的 这应该是匹配的时候做 语言敏感匹配。对于 例如,在一个主要的力量,“” 将根据 UCA和“aa”将匹配 UCA的丹麦剪裁。

        2
  •  2
  •   devio    16 年前

    返回排序规则为Latin1\u General\u CI\u AS(SQL2000)的行。

    您可以使用COLLATE<为表列指定排序规则;排序规则>N/VARCHAR后面的关键字。

    还可以使用语法将字符串与特定排序规则进行比较

    string1 = string2 COLLATE < collation >
    
        3
  •  2
  •   Community Mohan Dere    9 年前

    这不是一个解释行为的答案,但可能是相关的:

    在里面 this 问题,我学会了使用

    Latin1_General_Bin 
    

        4
  •  1
  •   marc_s MisterSmith    16 年前

    一些帮助者的答案-不是你问题的完整答案,但仍然可能有用:

    如果您尝试:

    SELECT 1 WHERE N'fußball' = N'fussball'  
    

    你会得到“1”-当使用“N”表示Unicode时,两个字符串被认为是相同的-为什么会这样,我还不知道。

    找到 默认排序规则

    SELECT SERVERPROPERTY('Collation')
    

    找到 在数据库中,使用以下查询:

    SELECT
      name 'Column Name', 
      OBJECT_NAME(object_id) 'Table Name', 
      collation_name
    FROM sys.columns
    WHERE object_ID = object_ID('your-table-name') 
    AND name = 'your-column-name'
    
        5
  •  1
  •   Remus Rusanu    16 年前

    奖励问题(答案?):@scotcher “fussball”被当作varchar。 此查询确实返回一个结果:

    select 1 where 'fußball' = cast('fussball' as nvarchar)

    Data Type Precedence . 总是使用更高优先级的类型进行比较:

    当一个运算符将两个 不同数据类型的表达式, 数据类型优先规则 指定具有 低优先级转换为 具有更高优先级的数据类型。

    由于nvarchar的优先级高于varchar,因此示例中的比较将使用nvarchar类型进行,因此它与 select 1 where N'fußball' =N'fussball'