【问题标题】:PHP / SQL: searching against html entities stored in databasePHP / SQL:搜索存储在数据库中的 html 实体
【发布时间】:2017-09-09 03:55:51
【问题描述】:

我经常使用使用重音字符的语言,例如é。我将内容存储在“utf_8_bin”编码表中,并将重音字符转换为 HTML 实体。

因此,例如,“Términator”将在数据库中存储为“T & eacute ; rminator”(必须在其中添加空格以阻止其在线呈现)。

当用户搜索“términator”时,会找到匹配项,因为该查询也被转换为 HTML 实体,并且 SQL 查询将参数的两边都“小写”为“lcase”。

我现在遇到的问题是,客户希望能够搜索“终结者”(“e”上没有重音)以获得匹配“终结者”的结果。

我不希望改变我存储数据的方式,特别是因为存储 HTML 实体可以解决许多其他问题。所以我问是否有更简单的解决方案。谢谢!

【问题讨论】:

  • 你试过用like运算符吗?此外,您可能必须双重存储数据以满足该要求。一个保持原样,然后又去掉了重音等。
  • 也许比较两者的 levenshtein 可能会奏效,或者类似的东西......您是否预计该项目有一个大型数据库?
  • @SloanThrasher - 我正在使用 like 运算符:其中 lcase('T&eacuterminator') like lcase('%content%')。内容实际上是一篇完整的文章。不过,双重存储数据是一个非常可行的解决方案——如果我找不到另一个解决方案,我会考虑这样做。谢谢。
  • @Shane - Levenshtein 本来是完美的选择 - 除了内容是一篇完整的文章,因此需要检查数千个单词每篇文章(它们将是数百个文章),并且距离总是必须至少为 8 (é) - 我认为。耻辱。
  • 将所有 é 实例替换为搜索的字母 'e' 会不会有太多开销?

标签: php mysql html-entities


【解决方案1】:

您应该在查询中使用正确的排序规则 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érminatorTerminator 等的记录,请注意,它会进行不区分大小写的比较(排序规则中的_ci 部分)。

utf8_unicode_ci 的速度有点慢,但这确实非常小,您可能甚至不会注意到其中的差异。

有更多的排序规则可以满足您的需求,不确定是否有一个可用于 html 实体。您可以将自己的排序规则添加到 mysql 数据库以创建支持自己的 htmlentities,例如 utf8_htmlentities_cihttps://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 内容时将其转换为包含实体。在数据库中拥有实体会破坏正确搜索的能力。如果您需要输出到与 HTML 不同的格式,也会导致问题。
  • 我同意您不应该将 html 实体存储到数据库中,这会带来比解决问题更多的复杂性。一个很好的数据库迁移将 htmlentities 删除回原始字符将是最好的解决方案。
  • 看来我还有一些工作要做。我实际上会继续这样做:迁移没有 html 实体的内容,然后使用建议的排序规则进行搜索。我将 HTML 实体存储在数据库中,因为它是(至少曾经是)确保重音字符不会在显示时“损坏”的最佳方式。我想现在利弊大于利——我还有其他问题,比如试图只显示字符串的前 100 个单词。非常感谢你们的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 2021-10-23
  • 2015-12-19
  • 2017-02-02
  • 2010-11-11
  • 2023-03-14
相关资源
最近更新 更多