Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 执行不区分重音的全文搜索MySQL_Php_Mysql_Utf 8_Full Text Search_Diacritics - Fatal编程技术网

Php 执行不区分重音的全文搜索MySQL

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

我目前正在开发一个网站的搜索功能。用户按名称搜索其他用户。对于名字上带有口音的用户,我很难获得好的结果

我在name列上有一个全文索引,表的排序规则是utf8\u general\u ci

当前,如果有人注册了该站点,并且其名称带有重音符号(例如:Alberto Andrés),则该名称将存储在DB中,如下图所示:

因此,如果我对('alberto andres')执行以下查询
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。