忽略特殊 Unicode 字符的字符串比较

Posted

技术标签:

【中文标题】忽略特殊 Unicode 字符的字符串比较【英文标题】:String comparison that ignores special unicode charaters 【发布时间】:2019-08-03 18:43:19 【问题描述】:

我有一张表格,上面有各种语言的城市名称。这些名称通常包含诸如éü 等字符。我正在构建一个搜索功能,以便用户可以搜索名称,但我希望这忽略所有特殊字符,并将它们视为来自改为英文的 26 个字母。

例如,对名称 munchen 的查询应与值 München 匹配。该查询将比较的双方转换为不区分大小写的 26 个字母,然后 然后 执行比较。

有没有直接的方法来实现这一点?

【问题讨论】:

您使用的是 Sybase 还是 SQL Server?什么版本? 对不起,@ZoharPeled。我使用 SQL Server 2014.. Unicode 中没有特殊字符。尤其不是普通的拉丁字符。你真正想做什么?将所有内容都转换为英语是为了解决这个问题,但除了一些非常有限的情况外,它不会起作用。 @PanagiotisKanavos 正确,我什至没有想到...... 例如,如果您使用不区分重音的排序规则,则 Munchen 可以匹配 München。 SQL Server 的全文搜索功能已经可以处理此类匹配,无论排序规则如何。任何与此相关的搜索引擎都可以处理此问题 【参考方案1】:

这些字符在任何方面都不特殊。匹配和排序受列排序规则的影响 - 这指定排序顺序和匹配的字符。

排序规则可以区分大小写,它指定Mary 是否被视为等于mary。它也可以是accent敏感的,它指定Munchen是否等于München

要将MunchenMünchen 匹配,只需对该列使用不区分重音的排序规则,例如:

create table Cities (
    id int identity primary key,
    Name nvarchar(200) COLLATE Latin1_General_CI_AI ,
    INDEX IX_Cities_NAME (Name)
)

insert into Cities (Name)
values ('London'), ('München'), ('Munchen')

select * 
from Cities 
where Name = N'mUnchen'

结果是:

Name
--------
München
Munchen

我没有将Name 设为主键,因为我无法同时插入MünchenMunchen,我会遇到主键违规

【讨论】:

以上是关于忽略特殊 Unicode 字符的字符串比较的主要内容,如果未能解决你的问题,请参考以下文章

比较 unicode 字符时,Javascript 字符串比较失败

将单词与特殊字符(é、è、...)进行比较时忽略变音符号

在忽略特殊字符的同时匹配和替换子字符串

JS正则表达式之特殊符号

如何在忽略不可编码字符的同时输出Python3(unicode)字符串

字符串前面加urb的含义