MySQL中的重音不敏感搜索查询

oca*_*nal 21 mysql search diacritics

有没有办法让搜索查询重音不敏感?

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

例如:toruń

select * from pages where title like '%torun%'
Run Code Online (Sandbox Code Playgroud)

它找不到"toruń".我怎样才能做到这一点?

goa*_*oat 24

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

...where title like '%torun%' collate utf8_general_ci
Run Code Online (Sandbox Code Playgroud)

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

或者,您可以将列复制到另一列,例如searchable_title,但更改其上的排序规则.这种类型的东西实际上很常见,在这种情况下,你可以复制数据,但是它有一些稍微不同的形式,它们针对某些特定的工作负载/目的进行了优化.您可以使用触发器作为保持重复列同步的好方法.如果编入索引,此方法有可能表现良好.

注 - 确保您的数据库确实具有这些字符而不是html实体.此外,您的连接的字符集很重要.上面假设它设置为utf8,例如,通过集合名称,set names utf8

如果没有,您需要一个文字值的介绍人

...where title like _utf8'%torun%' collate utf8_general_ci
Run Code Online (Sandbox Code Playgroud)

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


Kie*_*ran 6

这在极端情况下不起作用,但是请尝试将列排序规则更改为UFT8 utf8_unicode_ci。这样,重音字符将等于其非重音字符。