我有一个名为products
的表,它有一个用latin1_swedish_ci
编码的varchar
列name
。
我正在尝试进行一个搜索查询,以便使用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-与匹配