Php 执行不区分重音的全文搜索MySQL
我目前正在开发一个网站的搜索功能。用户按名称搜索其他用户。对于名字上带有口音的用户,我很难获得好的结果 我在name列上有一个全文索引,表的排序规则是utf8\u general\u ci 当前,如果有人注册了该站点,并且其名称带有重音符号(例如:Alberto Andrés),则该名称将存储在DB中,如下图所示: 因此,如果我对('alberto andres')执行以下查询Php 执行不区分重音的全文搜索MySQL,php,mysql,utf-8,full-text-search,diacritics,Php,Mysql,Utf 8,Full Text Search,Diacritics,我目前正在开发一个网站的搜索功能。用户按名称搜索其他用户。对于名字上带有口音的用户,我很难获得好的结果 我在name列上有一个全文索引,表的排序规则是utf8\u general\u ci 当前,如果有人注册了该站点,并且其名称带有重音符号(例如:Alberto Andrés),则该名称将存储在DB中,如下图所示: 因此,如果我对('alberto andres')执行以下查询SELECT*MATCH(name)我会得到很多匹配分数更好的结果,比如'alberto'、'andres'、'and
SELECT*MATCH(name)
我会得到很多匹配分数更好的结果,比如'alberto'、'andres'、'andres',最后是匹配分数较低的记录,用户可能正在寻找'alberto andres'
考虑到重音记录当前存储在数据库中的方式,我可以做些什么
谢谢 在我看来,厄尔塞诺·安德烈斯的姓氏实际上是正确存储的。您向我们展示的呈现方式是一些非UTF应用程序破坏UTF8文本的方式 如果表中还没有一大堆记录,您可以尝试对查询进行这种修改。全文(非布尔)模式在小数据集上工作异常
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列位于相同的字符集。感谢Ollie的回答!布尔模式不会改善结果。和“使用utf8”返回相同的记录。有趣的是,如果我在php上执行utf8_编码('Alberto Andrés'),并将输出传递给查询,我会得到Alberto Andrés作为第一个结果。当用户在搜索查询中输入没有重音符号的姓名时,我还没有找到解决方案。我知道这有点晚了,但这两项都不能改善我的搜索。我遇到过这样的情况,用户可以输入“Z,C,S,D”,但DB必须返回包含“Ž,Š,Č,Ć和Đ”的结果。整个上午在web上搜索都没有结果:D。