如何在 SQL Server 中执行不区分重音的比较(e 与 è、é、ê 和 ë)?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何在 SQL Server 中执行不区分重音的比较(e 与 è、é、ê 和 ë)?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server CE 4 Entity Framework 4.3.1 Code First 不区分重音和不区分大小写的搜索

SQL Server数据库使用什么排序规则?

如何使用 PredicateBuilder、EF Core 5 和 Postgresql 10+ 执行不区分大小写和重音的 LIKE(子字符串)查询?

sql网络服务的编辑器怎么调出来

SQL Server转换数据库的排序规则

PostgreSQL 是不是支持“不区分重音”排序规则?