代码之家  ›  专栏  ›  技术社区  ›  Amy B

为什么“”在NVarchar中与“oe”匹配,而在Varchar中与“oe”不匹配

  •  3
  • Amy B  · 技术社区  · 7 年前
    SELECT REPLACE(N'Chloe', 'œ', 'o'), REPLACE('Chloe', 'œ', 'o')
    

    结果如下:

    Chlo    Chloe
    

    这太奇怪了。


    另一种方式:

    SELECT
      CASE WHEN N'œ' = N'oe' THEN 1 ELSE 0 END as NVarcharMatch,
      CASE WHEN 'œ' = 'oe' THEN 1 ELSE 0 END as VarcharMatch
    

    结果如下:

    NVarCharMatch   VarcharMatch
    1   0
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Dan Guzman    7 年前

    传统SQL排序规则(“SQL”排序规则前缀)和二进制排序规则(“BIN”前缀)一次只比较单个字符,因此“Ϩ”永远不能等于“oe”。

    Windows排序规则和Unicode比较使用更健壮的比较规则。这允许单个“✔”字符与两个连续字符“oe”进行比较,因为它们在语义上是相同的。

    --Chlo because Unicode comparison equal
    SELECT REPLACE(N'Chloe' COLLATE SQL_Latin1_General_CP1_CI_AS, 'œ', 'o'); 
    
    --Chloe because legacy SQL comparison unequal
    SELECT REPLACE('Chloe' COLLATE SQL_Latin1_General_CP1_CI_AS, 'œ', 'o'); 
    
    --Chloe because binary comparison unequal
    SELECT REPLACE('Chloe' COLLATE Latin1_General_BIN, 'œ', 'o');
    
    --Chlo because Windows collation comparison equal
    SELECT REPLACE('Chloe' COLLATE Latin1_General_CI_AS, 'œ', 'o');