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

86

我想在SQL中比较两个varchar,一个会是像Cafe这样的字符串,而另一个则是Café,有没有一种方法可以在SQL中比较这两个值。例如:

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

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

3个回答

130

将字符集转换为不区分大小写的排序规则(collation)

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

并且,因为常量值将具有数据库的排序规则。更新:只适用于本地变量,而不适用于常量不对,即使是对于常量也不适用。

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

22
在这种情况下,您不需要两次提供排序规则:SELECT * FROM Venue WHERE Name Like '%cafe%' COLLATE Latin1_general_CI_AI - PollusB
我已经实现了这个答案,搜索是不区分重音的,但副作用是在选择查询中我会错过一些带重音的字母,例如带锐音符的c(U+0107)。在列属性中,我看到SQL_Latin1_General_CP1_CI_AI排序规则。我使用以下语句更改了排序规则:ALTER TABLE mytable ALTER COLUMN description varchar(48) COLLATE SQL_Latin1_General_CP1_CI_AI。之前它是Czech_CI_AS排序规则。如果我在不更改列的排序规则的情况下使用答案中的查询,在实体框架中它将无法工作。 - Tomas Kubes

56

通过在选择语句中应用特定的不区分大小写排序规则

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

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


12
啊,原来结尾处那些奇怪的字母是这个意思。虽然有点傻,但这对我帮助很大。不知怎么的,对我来说,数据库排序总是让我感到困惑。请帮我翻译这段话。 - ilivewithian
非常有用的解释。我可以得出结论,我需要芬兰瑞典CI_AI。在瑞典语中,我们的字母表包括å、ä和ö,而我的目标是像é这样不属于其中的变音符号。 - undefined

11

使用 Latin1_general_CI_AI 可以进行区分音调和不区分音调的搜索。

这里,AI 表示不区分音调,AS 表示区分音调。例如,如果不区分音调,CaféCafe 是相同的。

在下面的查询中,Latin1_general_CI_AI 可以分解为以下几个部分:

  • latin1 使服务器使用 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接