PHP / SQL:搜索存储在数据库中的 html 个实体
PHP / SQL: searching against html entities stored in database
我经常使用使用重音字符的语言,例如é。我将内容存储在 "utf_8_bin" 编码表中,并将重音字符也转换为 HTML 实体。
因此,例如,"Términator" 在数据库中将存储为 "T & eacute ; rminator"(必须在其中添加空格以阻止其在线呈现)。
当用户搜索 "términator" 时会找到一个匹配项,因为查询也被转换为 HTML 实体并且 SQL 查询 "lowercases" 参数的两边"lcase".
我现在遇到的问题是,客户希望能够搜索 "Terminator"(不强调 "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
此查询将 return 标题为 términator
、Terminator
等的记录,请注意它会进行不区分大小写的比较(排序规则中的 _ci
部分) .
utf8_unicode_ci
有点慢,但这确实很小,您甚至可能不会注意到其中的差异。
还有更多排序规则可以满足您的需求,不确定是否有可用于 html 实体的排序规则。您可以将自己的排序规则添加到 mysql 数据库,以创建 html 支持自己的实体,例如 utf8_htmlentities_ci
。 https://dev.mysql.com/doc/refman/5.7/en/adding-collation.html
这里有一个很好的例子 phone 数字 https://dev.mysql.com/doc/refman/5.7/en/ldml-collation-example.html
我经常使用使用重音字符的语言,例如é。我将内容存储在 "utf_8_bin" 编码表中,并将重音字符也转换为 HTML 实体。
因此,例如,"Términator" 在数据库中将存储为 "T & eacute ; rminator"(必须在其中添加空格以阻止其在线呈现)。
当用户搜索 "términator" 时会找到一个匹配项,因为查询也被转换为 HTML 实体并且 SQL 查询 "lowercases" 参数的两边"lcase".
我现在遇到的问题是,客户希望能够搜索 "Terminator"(不强调 "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
此查询将 return 标题为 términator
、Terminator
等的记录,请注意它会进行不区分大小写的比较(排序规则中的 _ci
部分) .
utf8_unicode_ci
有点慢,但这确实很小,您甚至可能不会注意到其中的差异。
还有更多排序规则可以满足您的需求,不确定是否有可用于 html 实体的排序规则。您可以将自己的排序规则添加到 mysql 数据库,以创建 html 支持自己的实体,例如 utf8_htmlentities_ci
。 https://dev.mysql.com/doc/refman/5.7/en/adding-collation.html
这里有一个很好的例子 phone 数字 https://dev.mysql.com/doc/refman/5.7/en/ldml-collation-example.html