0

我有一个名为的表products,其中有一个varchar名为nameencoding in的列latin1_swedish_ci

我正在尝试进行搜索查询,以便name使用如下所示的MATCH() AGAINST()句子过滤产品:

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 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 'CONVERT(BINARY(name) USING utf8)) AGAINST('*Colageno*' IN BOOLEAN MODE)' 附近使用正确的语法

我只想捕捉特殊字符,例如á, é, í, ó, ú.

提前致谢!

4

1 回答 1

0

正如答案的作者指出的那样,您可以使用CONVERT(BINARY(name) USING utf8)代替CONVERT(BINARY(name) USING utf8).

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

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

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

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

于 2022-01-27T23:07:48.363 回答