【问题标题】:How do I perform an accent insensitive compare (e with è, é, ê and ë) in SQL Server?如何在 SQL Server 中执行不区分重音的比较(e 与 è、é、ê 和 ë)?
【发布时间】:2011-01-28 12:36:10
【问题描述】:

我希望比较 SQL 中的两个 varchar,一个类似于 Cafe,另一个 Café 在 SQL 中是否有一种方法可以比较这两个值。例如:

SELECT *
FROM Venue
WHERE Name Like '%cafe%'

那么如果有一个名为Big Bobs Café Extraordinaire 的场所,它会被包含在结果集中吗?

【问题讨论】:

    标签: sql-server-2005 tsql collation


    【解决方案1】:

    强制转换为不区分重音的collation

    如果要与表变量或临时表 varchar 列进行比较,您还需要确保双方具有相同的排序规则以避免错误或进一步强制

    并且因为常量值将具有数据库更新的排序规则:仅适用于局部变量,不适用于常量不,甚至没有

    SELECT *
    FROM Venue
    WHERE
       Name COLLATE Latin1_general_CI_AI Like '%cafe%' COLLATE Latin1_general_CI_AI
    

    【讨论】:

    • 在这种情况下您不需要提供两次排序规则:SELECT * FROM Venue WHERE Name Like '%cafe%' COLLATE Latin1_general_CI_AI
    • 我实现了这个答案,搜索对重音不敏感,但副作用是我在选择查询中缺少一些重音。例如带有急性 (U+0107) 的 c。在列属性中,我看到 SQL_Latin1_General_CP1_CI_AI 排序规则。我使用以下语句更改了排序规则:ALTER TABLE mytable ALTER COLUMN description varchar(48) COLLATE SQL_Latin1_General_CP1_CI_AI。之前它曾经是 Czech_CI_AS 排序规则。如果我在答案中使用查询而不更改列的排序规则,则它在实体框架中不起作用。
    【解决方案2】:

    通过将不区分特定重音的collation 应用于您的选择:

    SELECT * 
    FROM Venue 
    WHERE Name COLLATE Latin1_General_CI_AI Like '%cafe%' COLLATE Latin1_General_CI_AI
    

    CI 代表“不区分大小写”,AI 代表“不区分重音”。

    【讨论】:

    • 啊,最后那些傻字就是这个意思。我知道这很愚蠢,但这有很大帮助。不知何故,对我来说,DB 排序规则似乎总是带来脑雾。
    【解决方案3】:

    可以使用Latin1_general_CI_AI进行重音敏感和重音不敏感搜索

    这里AI 用于不区分口音,AS 用于区分口音 即,如果不区分口音,CaféCafe 是相同的。

    在下面的查询中Latin1_general_CI_AI 可以分解为以下部分。

    • latin1 使服务器使用 charset latin 1 处理字符串,基本上是 ascii。

    • CI 指定不区分大小写,因此“ABC”等于“abc”。

    • AI 指定不区分重音,因此 'ü' 等于 'u'。

    您的查询应如下所示:

    SELECT * FROM Venue WHERE Name COLLATE Latin1_general_CI_AI Like '%cafe%' COLLATE Latin1_general_CI_AI
    

    预期的结果如下:

     Id  name
     1  Café
     2  Cafe
    

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 2017-03-20
      • 1970-01-01
      • 2023-03-28
      • 2015-03-10
      • 2011-03-13
      • 2017-03-19
      • 1970-01-01
      • 2013-02-13
      相关资源
      最近更新 更多