MySQL中不区分大小写的搜索查询

27

有没有办法使搜索查询不区分重音符号?

列和表的字符集(collation)为utf8_polish_ci,我不想改变它们。

例如单词:toruń

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

它无法找到"toruń"。我该怎么办?


1
https://dev59.com/M3E95IYBdhLWcg3wdtqj - Sun
@SunWKim 我之前尝试过,但对我没用。 - Okan Kocyigit
我认为波兰语希望将 ń 视为与 n 不同的字符。 - Rick James
3个回答

35

你可以在SQL查询中运行时更改排序规则。

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

请注意,运行时更改排序规则会放弃 MySQL 使用索引的可能性,因此大表的性能可能很差。

或者,您可以将该列复制到另一列(例如searchable_title),但更改其排序规则。 实际上,这种类型的操作很常见,其中您可以复制数据,但以某些稍微不同的形式进行优化,以适应某些特定的工作负载/目的。 您可以使用触发器来保持重复的列同步。 如果建立了索引,此方法具有良好的性能潜力。

请注意-确保您的数据库确实具有这些字符而不是HTML实体。 同时,连接的字符集也很重要。 以上假设它设置为utf8,例如通过set names命令设置为set names utf8

如果不是,则需要使用introducer来表示文本值

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

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


1
你有任何想法为什么它无法识别Ł(波兰带重音的L,例如Łódź城市)吗?...where city like _utf8'%lodz%' collate utf8_general_ci - suz
@suz - 在 utf8_general_ci 中,Ł 排在 Z 之后;在 utf8_unicode_520_ci 中与 L 相同;对于其他排序规则,则在 LM 之间。MySQL 8.0 拥有更新的排序规则:http://mysql.rjweb.org/utf8mb4_collations.html。 - Rick James
1
更新:不再推荐使用 utf8_general_ci。有关现代替代方案的讨论,请参见排序规则讨论。回顾过去,即使在撰写本答案时,utf8_unicode_ci也比utf8_general_ci更可取。因此,在未转换为 utf8mb4 的旧数据库上,utf8_unicode_ci将是更好的选择,依我之见。 - ToolmakerSteve

9

在极端情况下这种方法可能不适用,但是尝试将列的排序规则更改为 utf8_unicode_ci。然后,带重音的字符将等于其无重音的对应字符。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接