有没有办法使搜索查询不区分重音符号?
列和表的字符集(collation)为utf8_polish_ci,我不想改变它们。
例如单词:toruń
select * from pages where title like '%torun%'
它无法找到"toruń"。我该怎么办?
有没有办法使搜索查询不区分重音符号?
列和表的字符集(collation)为utf8_polish_ci,我不想改变它们。
例如单词:toruń
select * from pages where title like '%torun%'
它无法找到"toruń"。我该怎么办?
你可以在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查询不是。
...where city like _utf8'%lodz%' collate utf8_general_ci
- suzŁ
排在 Z
之后;在 utf8_unicode_520_ci 中与 L
相同;对于其他排序规则,则在 L
和 M
之间。MySQL 8.0 拥有更新的排序规则:http://mysql.rjweb.org/utf8mb4_collations.html。 - Rick Jamesutf8_general_ci
。有关现代替代方案的讨论,请参见排序规则讨论。回顾过去,即使在撰写本答案时,utf8_unicode_ci
也比utf8_general_ci
更可取。因此,在未转换为 utf8mb4 的旧数据库上,utf8_unicode_ci
将是更好的选择,依我之见。 - ToolmakerSteve在极端情况下这种方法可能不适用,但是尝试将列的排序规则更改为 utf8_unicode_ci
。然后,带重音的字符将等于其无重音的对应字符。
ń
视为与n
不同的字符。 - Rick James