【问题标题】:Simple like query in sql server return no resultsql server中的简单like查询不返回结果
【发布时间】:2012-03-15 20:17:29
【问题描述】:

我在 sql server 上有一个简单的 LIKE 查询,当前导字符与第一个字符相同时不返回任何结果...

数据库故事包含字段“姓氏”和值“Aalesund”的行

select * 
from table 
where LastName like 'A%' -- returns no results

如果我将“姓氏”字段更改为包含“Alesund”,则完全相同的查询将返回正确的行。

有什么想法吗?

斯蒂格

【问题讨论】:

  • 你确定'Alesund'中没有前导空格吗?
  • 鉴于你来自奥斯陆,我会怀疑一个有趣的 A,比如 À、Á、Â、Ä 或 Å
  • 难道没有像Åen.wikipedia.org/wiki/%C3%85这样的怪异角色吗?
  • 所以它包含带有双 A 的 Aalesund 但匹配 Alesund?您的数据库的默认排序规则以及列的排序规则和数据类型是什么?

标签: sql sql-server


【解决方案1】:

在 Sql server 的丹麦语/挪威语排序规则中,“aa”被认为是 å 的“同义词”,因为这封信是 1940 年代之前在丹麦的书写方式。这也意味着“aa”在排序时被认为是字母表的最后一个字母。

我不知道这种行为在挪威语环境中是否有意义,但我认为排序规则在 Sql server 2012 中被分成两部分,也许这会解决它。

更新:根据维基百科,挪威将“Aa”用作“Å”的用法与丹麦的用法相似:几十年来官方组织标准化语言已废除“Aa”,但一些城镇拒绝由于历史原因改名,“Aa”在姓氏中仍然很常见。

基于此,我会说在搜索 LIKE “A%”时未能找到“Aalesund”是挪威本地化应用程序中最正确的行为。如果您避免使用丹麦/挪威排序规则来更改此设置,您应该注意它会更改其他属性,例如特殊字母的排序,如上所述。

名为 Danish_Norwegian_... 的许多不同排序规则对您 AFAIK 没有帮助。他们指定了关于区分大小写、重音、字符宽度和假名类型的行为(我相信后者仅与日语相关)。 “Å”不被认为是重音“A”,而是一个独特的字母。排序规则命名约定的描述在this MSDN article

更新2:令人惊讶的是,排序规则Norwegian_100_CI_AI 似乎可以满足您的要求。或许丹麦和挪威的用法毕竟不同……

【讨论】:

  • 尽管如此,仍有一些无法解释的事情。为什么AaAlesund 中匹配A 而在A% 中却不匹配?
  • 这听起来可能是问题所在。我可以更改什么排序规则以仍然支持挪威字符?所有不同的丹麦 - 挪威选项之间有什么区别? (这不是我的域:))
  • @MartinSmith 我阅读问题的方式,“A%”匹配“Alesund”,但不匹配“Aalesund”。由于“Aalesund”实际上是“Ålesund”,这是我所期望的行为(作为丹麦语使用者)。
  • @JonasH - 是的,我以为他们在更改搜索词而不是列值。谜团解开了!
  • @JonasH '无效的排序规则'Norwegian_100_CI_AI'。'如果我更改数据库的排序规则。会有什么影响?会不会影响现有数据?
【解决方案2】:

这个名字有时拼写为“Ålesund”。 A 上方的小圆圈在某些字体中非常小。当您尝试使用全名进行查询时,您可能无意中复制/粘贴了“Ålesund”。试试

select *  from table  where LastName like 'Å%'

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2020-07-09
    • 2017-05-24
    • 2011-06-24
    • 1970-01-01
    相关资源
    最近更新 更多