【问题标题】:Best way to select from database and using special characters从数据库中选择并使用特殊字符的最佳方法
【发布时间】:2012-09-10 02:42:25
【问题描述】:

我想把以下问题摆在你面前。

数据库由各种名称组成。这些名称可以包含“特殊”字符,例如 é、ê 等。

我的计划是创建一个包含数据库名称的 SEO 友好 URL。链接的创建不是什么大问题,只需使用 normalize 函数或 str_replace 函数将所有特殊字符替换为正常字符即可。

但是当我想使用 SEO 朋友 URL 查询数据库时(在必要的验证和检查之后)。由于特殊字符,数据库当然不会返回任何结果。

现在问题来了,有没有一种方法可以在没有特殊字符的情况下查询数据库,或者最好在数据库中有一个单独的列来存储没有特殊字符的名称(在创建链接并易于查询)。这将需要维护两列,但可以让我轻松查询数据库。

有什么想法吗?

【问题讨论】:

  • 在 utf-8 中做所有事情。无需特殊处理。
  • 数据库为什么不返回带有特殊字符的结果?如果您使用适当的字符集,它们应该像其他任何字符集一样是可查询的(需要注意一些特殊字符特别区分大小写(Straße/Strasse))
  • 请注意,数据库包含带有特殊字符的名称“hôtel”在数据库中:“hôtel”。当我查询它时,我使用查询字符串'hotel'。

标签: php mysql seo


【解决方案1】:

简单的方法是在 URL 中添加一个 ID,例如来自 Stackflow 的 URL。

【讨论】:

  • 那是我的后备方案,但从视觉上我并不喜欢它。
  • 您可以在查询中创建一个巨大的替换语句。这是一次大量的工作和时间:WHERE REPLACE(fieldname, 'ô', 'o') = '{$sURL}'
【解决方案2】:

根据排序规则,hôtel 将等于 hotel

mysql> select 'hôtel' = 'hotel';
+--------------------+
| 'hôtel' = 'hotel'  |
+--------------------+
|                  1 |
+--------------------+

您遇到的问题是您正在存储 html 实体 (hôtel),我认为这是非常错误的,因为您将演示问题与持久性问题混为一谈。摆脱它并为您的字符集选择适当的排序规则,然后将其设置为数据库默认值或set it for each query

一个适合网络使用的字符集是utf8。到set the database上做:

create database mydatabase character set utf8 collate utf8_unicode_ci;

【讨论】:

  • 您能建议如何设置数据库吗?您的建议是在数据库中没有 html 实体,而只有实际字符?有什么好的建议/资源可以让我找到更多相关信息吗?
  • @Ralf 编辑了答案以包含create database 语句。是的,我的意思是您存储实际字符而不是 html 实体。
  • 在一个小测试中它完美运行。似乎是最好的选择。我需要改变我的桌子,但这会对网站的制作产生很大的影响。
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2014-08-29
  • 2018-08-17
  • 1970-01-01
相关资源
最近更新 更多