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


72

我正在寻找比较SQL中的两个varchar,一个类似Cafe,而另一个Café在SQL中有一种方法可以比较两个值。例如:

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

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

Answers:


114

强制为重音不敏感排序规则

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

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

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

17
在这种情况下,您无需提供两次排序规则:SELECT * FROM Venue WHERE名称类似于'%cafe%'COLLATE Latin1_general_CI_AI
PollusB 2014年

@PollusB:真的,是我不好
GBN

我实现了这个答案,搜索对重音不敏感,但是副作用是我在选择查询中缺少了一些重音。例如,c代表急性(U + 0107)。在列属性中,我看到SQL_Latin1_General_CP1_CI_AI排序规则。我使用以下语句更改了排序规则:ALTER TABLE mytable ALTER COLUMN说明varchar(48)COLLATE SQL_Latin1_General_CP1_CI_AI。以前是Czech_CI_AS排序规则。如果我在答案中使用查询而不更改列的排序规则,则该查询在实体框架中不起作用。
Tomas Kubes,2016年

50

通过将特定的重音不敏感排序规则应用于您的选择:

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

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


10
啊,这就是最后所有那些愚蠢的人物的意思。我知道这很愚蠢,但这很有帮助。以某种方式,对我而言,DB排序规则似乎总是带来麻烦。
ilivewithian 2010年

9

通过使用可以进行口音敏感和口音不敏感搜索 Latin1_general_CI_AI

这里AI是针对重音不敏感的,AS对于重音敏感的,即,如果对重音不敏感,则CaféCafe相同。

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

  • latin1 使服务器使用字符集拉丁文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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.