【问题标题】:String comparison that ignores special unicode charaters忽略特殊 Unicode 字符的字符串比较
【发布时间】: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 的全文搜索功能已经可以处理此类匹配,无论排序规则如何。任何与此相关的搜索引擎都可以处理此问题

标签: tsql sql-server-2014 string-comparison character-set


【解决方案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,我会遇到主键违规

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2015-07-15
    相关资源
    最近更新 更多