如何使不区分重音的`MATCH()AGINST()`句子



我有一个名为products的表,它有一个用latin1_swedish_ci编码的varcharname

我正在尝试进行一个搜索查询,以便使用MATCH() AGAINST()句子按name筛选产品,该句子看起来如下:

SELECT *
FROM products
WHERE MATCH(name) AGAINST('*search_string*' IN BOOLEAN MODE)

它在没有重音的varchars中运行得非常好,但是,如果我有一个名为Colágeno的产品,并且搜索输入是Colageno,那么查询将无法捕获该产品。

所以我尝试了这个So答案中显示的内容,但没有成功。

SELECT *
FROM products
WHERE MATCH(CONVERT(BINARY(name) USING utf8)) AGAINST('*Colageno*' IN BOOLEAN MODE)

我得到了错误:

您的SQL语法有错误;在第3行的"CONVERT(BINARY(name(USING utf8("附近使用正确的语法,请查看与MySQL服务器版本相对应的手册

我只想捕获像á, é, í, ó, ú这样的特殊字符。

提前感谢!

正如答案的作者所指出的,您可以使用CONVERT(BINARY(name) USING utf8)而不是CONVERT(BINARY(name) USING utf8)

MySQL在将varchar值转换为全文时已经将其转换为二进制值。

创建索引时需要考虑到这一点,否则最终将在二进制数据中搜索,而不是在varchar数据中搜索。

另一种解决方案是对varchar列使用某种排序规则,比如latin1_general_ci。这样,搜索将始终将数据转换为二进制数据(如果varchar列还不是二进制列(,并在索引中以字节形式查找它。

你可以在这里阅读更多关于它的信息。

已解决

在评论中进行了一些讨论后,我意识到MATCH() AGAINST()语句中没有错误,因为默认情况下它不会区分变音符号。

因此,问题与变音符号如何存储在MySQL中有关,在我的情况下,它们的存储方式如下COLÁGENO->COLÃ<0x81>GENO。因此,有必要找出如何在不损坏表的情况下正确保存波浪形符号。

编码

我尝试通过在phpmyadmin中执行以下指令来更改编码:

ALTER TABLE products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

然而,性能没有变化。

然后,我尝试通过将DEFAULT CHARSET=latin1更改为DEFAULT CHARSET=utf8mb4来更改导出表文件中的编码,但结果也没有更改。

手动修改重音符号

我的另一个尝试是,一旦进行了编码更改,就用波浪号Á手动修改具有Ã<0x81>等字符的单元格。但遗憾的是,这似乎破坏了对该表的查询(我仍然能够正常访问其他表(。

所以我想了想masterguru在评论中所说的编码更改改变了脚本连接到表的方式,很明显,当我手动修改一个字符以放置波浪号时,脚本会继续访问表。具有上一个编码的表。

解决方案

脚本是用PHP编写的,所以我必须用这种语言找到解决方案。

我在英语SO中找到了这个答案,它说如何正确地将波浪号保存在数据库中。要做到这一点,你必须写。。。

mysqli_set_charset($connection, "utf8");

这是在连接到数据库之后。最后,我不得不将数据库中的稀有字符更改为相应的波浪号字符,以便MATCH AGAINST工作,瞧!


非常感谢大师、Triby和aeportugu在评论中提供的帮助!

原始帖子:https://es.stackoverflow.com/questions/511745/como-hacer-que-la-b%c3%basqueda-与匹配

最新更新