有没有办法让搜索查询重音不敏感?
列和表的排序规则是utf8_polish_ci,我不想更改它们。
示例词:toruń
select * from pages where title like '%torun%'
没有找到“toruń”。我怎么能这样做?
答案 0 :(得分:20)
您可以在sql查询中更改运行时的排序规则,
...where title like '%torun%' collate utf8_general_ci
但请注意,在运行时动态更改排序规则会导致mysql使用索引的可能性,因此在大型表上执行可能会非常糟糕。
或者,您可以将列复制到另一列,例如searchable_title
,但更改其上的排序规则。这种类型的东西实际上很常见,在这种情况下,你可以复制数据,但是它有一些稍微不同的形式,它们针对某些特定的工作负载/目的进行了优化。您可以使用触发器作为保持重复列同步的好方法。如果编入索引,这种方法有可能表现良好。
注意 - 确保您的数据库确实具有这些字符而不是html实体。
此外,您的连接的字符集很重要。以上假设它设置为utf8,例如,通过set names utf8
等set names
如果没有,您需要introducer作为文字值
...where title like _utf8'%torun%' collate utf8_general_ci
当然,单引号中的值实际上必须是utf8编码的,即使其余的sql查询不是。
答案 1 :(得分:4)
这在极端情况下不起作用,但尝试将列排序规则更改为UFT8 utf8_unicode_ci
。然后重音字符将等于他们的非重音字符。
答案 2 :(得分:1)
您可以尝试SOUNDEX:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex
这比较两个字符串的声音。但这显然会带来更多结果。