已经写过很多次了,Opencart 的基本搜索还不够好.. 好吧,我遇到了这个问题:
当客户在我的国家(斯洛伐克(UTF8))搜索产品时,他可能不会使用变音符号。所以他/她写下“cucoriedka”却一无所获。
但是,数据库中有一个名为“čučoriedka”的产品,我也希望它显示出来,因为这就是他要找的东西。
你知道如何完成这项工作吗?越简单越好!
我对斯洛伐克一无所知,对不起。但斯洛伐克语排序utf8_slovak_ci
规则将斯洛伐克语字母č
与c
. (在您的电话簿中,以Č开头的姓氏都在以C开头的姓氏之后吗?他们可能是这样的。MySQL 的创建者当然认为他们是这样的。)
排序规则utf8_general_ci
处理č
和c
相同。这是一个展示所有这些的 sql fiddle。http://sqlfiddle.com/#!9/46c0e/1/0
如果您将包含产品名称的列的排序规则更改为utf8_general_ci
,您将获得一个更易于搜索的表格。假设您的表被调用product
并且其中具有名称的列被调用product_name
。然后,此 SQL 数据定义语句将根据需要转换列。您应该查找列的实际数据类型,而不是varchar(nnn)
像我在此示例中所做的那样使用。
alter table product modify product_name varchar(nnn) collate utf8_general_ci
如果您无法更改表,那么您可以更改 WHERE 子句使其像这样工作,明确指定排序规则。
WHERE 'userInput' COLLATE utf8_general_ci = product_name
但这比更改列排序规则搜索起来要慢。
你可以使用MySQLSOUNDEX()
的SOUNDS LIKE
功能。
这些函数比较语音。
除了英语以外,soundex 的准确性值得怀疑。但是,如果我们像这样使用它,它可以得到改进
select soundex('ball')=soundex('boll') from dual
SOUNDS LIKE
也可以使用。
将两者结合使用SOUNDEX()
将SOUNDS LIKE
提高准确性。
请参阅 MySQL 文档以获取详细信息或mysql-sounds-like-and-soundex