我目前正在开发一个网站的搜索功能。用户按名称搜索其他用户。对于那些名字上有口音的用户,我很难获得好的结果。
我在name列上有一个全文索引,表的排序规则是utf8_general_ci。
当前,如果有人注册了该站点,并且其名称带有重音符号(例如:Alberto Andrés),则该名称将存储在数据库中,如下图所示:
因此,如果我执行下面的查询SELECT * MATCH(name) AGAINST('alberto andres')
我会得到很多匹配分数更好的结果,比如“Alberto”、“Andres”、“Andrés”,最后是匹配分数低的记录,用户可能会寻找“Alberto Andrés”。
我该怎么做才能考虑到数据库中当前存储重音记录的方式?
谢谢!
最佳答案
在我看来,厄尔塞诺或安德烈的姓氏实际上被正确地存储了起来。您向我们展示的呈现方式是一些非UTF应用程序处理UTF8文本的方式。
如果表中还没有一大堆记录,可以尝试修改查询。Fulltext(非布尔)模式在小数据集上工作异常。
SELECT *
FROM TABLE
WHERE MATCH(name) AGAINST('alberto andres' IN BOOLEAN MODE)
你也可以试试
SELECT *
FROM TABLE
WHERE MATCH(name) AGAINST(CONVERT('alberto andres' USING utf8))
只是为了确保匹配字符串与MySQL列在同一个字符集中。