如何在 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 不区分重音和不区分大小写的搜索
如何使用 PredicateBuilder、EF Core 5 和 Postgresql 10+ 执行不区分大小写和重音的 LIKE(子字符串)查询?