PHP/SQL:针对存储在数据库中的html实体进行搜索
我使用重音字符的语言工作很多,例如é。我将内容存储在“utf_8_bin”编码表中,并且我也将重音字符转换为HTML实体。PHP/SQL:针对存储在数据库中的html实体进行搜索
因此,例如,“Términator”将被存储为数据库中的“T & eacute; rminator”(不得不在空间中停止它在线渲染)。
当用户搜索“términator”时,发现匹配,因为查询也转换为HTML实体,而SQL查询使用“lcase”将参数两侧“小写”。
现在我遇到的问题是,客户端希望能够搜索“终结者”(没有重音的“e”),以获得匹配“Términator”的结果。
我不想改变存储我的数据的方式,特别是因为存储HTML实体可以解决一些其他问题。所以我问,如果有更简单的解决方案。谢谢!
你应该用在查询正确的排序规则在你的情况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数据库来创建支持你自己的类似utf8_htmlentities_ci
的htmlentities。 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
这是一个很好的答案。然而,由于他实际上将HTML实体存储在数据库中,因此它不适用于用户。这是错误的。您不应该将HTML实体存储在数据库中。数据库应该包含文本中的实际字符,而不是任何种类的编码。只有当您将文本输出到HTML内容时,才应该将文本转换为包含实体。让DB中的实体破坏正确搜索的能力。如果您需要输出与HTML不同的格式,它也会导致问题。 – Simba
我同意你不应该将html实体存储到数据库中,它会产生比解决它更多的复杂问题。一个很好的数据库迁移可以将最新的角色移回原始角色,这将是最好的解决方案。 –
看起来我有点工作要做。实际上我会继续:迁移没有html实体的内容,然后使用建议的排序规则进行搜索。我在数据库中存储了HTML实体,因为它是(至少曾经是)确保重音字符在显示时不会“破碎”的最佳方式。我认为现在利弊大于专业人士 - 我还有其他问题,比如试图只显示字符串的前100个单词。非常感谢您的帮助。 – NadeemH
您是否尝试过使用类似操作?此外,您可能必须将数据存储两次才能满足该要求。一个是,另一个是口音等删除。 –
也许比较两者的levenshtein可能有用,或者类似的东西......你预计这个项目有一个大型数据库吗? – Shane
@SloanThrasher - 我使用类似运算符:其中lcase('T&eacuterminator')像lcase('%content%')。内容实际上是一篇完整的文章。双存储数据是一个相当可行的解决方案 - 但我会考虑这样做,如果我找不到另一种解决方案。谢谢。 – NadeemH