【问题标题】:Accent insensitive search query in MySQLMySQL中的重音不敏感搜索查询
【发布时间】:2012-01-28 15:28:36
【问题描述】:

有什么方法可以让搜索查询的口音不敏感?

列和表的排序规则是 utf8_polish_ci,我不想更改它们。

例句:托伦

select * from pages where title like '%torun%'

它没有找到“toruń”。我该怎么做?

【问题讨论】:

  • @SunWKim 我之前尝试过,但对我不起作用。
  • @ocanal 您找到可以与我们分享的解决方案了吗?
  • @zvzej,接受的答案仍然对我有用。
  • 我认为波兰语想将 ńn 区别对待。

标签: mysql search diacritics


【解决方案1】:

这在极端情况下不起作用,但尝试将列排序规则更改为 UFT8 utf8_unicode_ci。那么重音字符将等于它们的非重音字符。

【讨论】:

    【解决方案2】:

    您可以在运行时在 sql 查询中更改排序规则,

    ...where title like '%torun%' collate utf8_general_ci
    

    但请注意,在运行时动态更改排序规则会放弃 mysql 使用索引的可能性,因此在大型表上的性能可能会很糟糕。

    或者,您可以将该列复制到另一列,例如searchable_title,但更改其上的排序规则。执行此类操作实际上很常见,您可以在其中复制数据,但将其以稍微不同的形式保存,以针对某些特定的工作负载/目的进行优化。您可以使用触发器作为保持重复列同步的好方法。如果已编入索引,此方法有可能表现良好。

    注意 - 确保您的数据库确实具有这些字符而不是 html 实体。 此外,连接的字符集也很重要。以上假设设置为 utf8,例如,通过 set namesset names utf8

    如果没有,您需要一个 introducer 作为文字值

    ...where title like _utf8'%torun%' collate utf8_general_ci
    

    当然,单引号中的值实际上必须是 utf8 编码的,即使 sql 查询的其余部分不是。

    【讨论】:

    • 你知道为什么它不适用于Ł(带有口音的波兰语L - 就像在城市Łódź)? ...where city like _utf8'%lodz%' collate utf8_general_ci
    • @suz - Ł 在 utf8_general_ci 中整理在 Z 之后;对于 utf8_unicode_520_ci,等于 LLM 之间的其他排序规则。 MySQL 8.0 有更新的排序规则:mysql.rjweb.org/utf8mb4_collations.html
    • 更新:utf8_general_ci 不再推荐。有关现代替代方案,请参阅discussion of collations。事后看来,即使这个答案写成utf8_unicode_ci 也比utf8_general_ci 更可取。因此,在未转换为 utf8mb4 的旧数据库上,utf8_unicode_ci 将是更好的选择,恕我直言。
    【解决方案3】:

    你可以试试 SOUNDEX:

    http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex

    这会根据它们的声音比较两个字符串。但这显然会带来更多结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多