我使用重音字符的语言工作很多,例如é。我将内容存储在“utf_8_bin”编码表中,我也将重音字符转换为HTML实体。
因此,例如,“Términator”将被存储为数据库中的“T& eacute; rminator”(必须有空格以阻止它在线呈现)。
当用户搜索“términator”时,会找到匹配项,因为查询也会转换为HTML实体,并且SQL查询会将参数的两侧“小写”为“lcase”。
我现在遇到的问题是,客户希望能够搜索“终结者”(“e”上没有重音)以获得与“Términator”匹配的结果。
我不想改变我存储数据的方式,特别是因为存储HTML实体解决了许多其他问题。所以我要问的是有一个更简单的解决方案。谢谢!
答案 0 :(得分:2)
您应该在您的查询中使用正确的排序规则utf8_unicode_ci
(这不包含html实体)
https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-sets.html
您使用的排序规则确定从数据库返回的结果。以及如何比较这些角色。
SELECT * FROM some_table WHERE title LIKE "Terminator" COLLATE utf8_unicode_ci
此查询将返回标题为términator
,Terminator
等的记录,请注意它会进行不区分大小写的比较(排序规则中的_ci
部分)。
utf8_unicode_ci
有点慢,但这真的很小,你可能甚至都不会注意到差异。
有更多的排序规则可以满足您的需求,不确定是否有可用于html实体的排序规则。您可以将自己的排序规则添加到mysql数据库,以便自己创建htmlentities,例如utf8_htmlentities_ci
。 https://dev.mysql.com/doc/refman/5.7/en/adding-collation.html
这是一个很好的例子,电话号码为https://dev.mysql.com/doc/refman/5.7/en/ldml-collation-example.html