忽略特殊 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
。
要将Munchen
与Mü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ünchen
和Munchen
,我会遇到主键违规
【讨论】:
以上是关于忽略特殊 Unicode 字符的字符串比较的主要内容,如果未能解决你的问题,请参考以下文章
比较 unicode 字符时,Javascript 字符串比较失败