【问题标题】:update mysql table encode special characters更新mysql表编码特殊字符
【发布时间】:2015-09-08 02:36:44
【问题描述】:

我有一个名为“电影”的 mysql 表。我刚刚发现有些电影包含特殊字符。例如,有些电影是我抓取并插入到我的表中的,例如“WALL·E”或“Mr.和史密斯夫人,但它们在 DB 中插入为 'WALL &middot ; E'和'先生。 &史密斯夫人'。这导致我的调查应用程序出现问题,因为例如我的调查中有一个自动完成字段,用户应该在其中插入他/她最喜欢的电影名称,所以如果用户试图找到 WALL·E,他必须插入 'WALL &middot ;啊!!

有什么方法(最好是在 mysql 中)我可以更新我的表并用它们的编码名称替换所有包含特殊字符的电影?

谢谢,

【问题讨论】:

  • 你不应该首先将编码文本插入数据库,但既然你已经......不要更改数据库。改变用户的输入。例如htmlspecialchars($user_input),然后搜索该编码文本。

标签: php mysql autocomplete special-characters encode


【解决方案1】:

这不是 MySQL 问题。

问题在于您存储到数据库中的值。

如果您想将字符串中的 HTML 实体“解码”为它们所代表的字符,您可以对从网页中抓取的值使用 PHP html_entity_decode 函数,然后将该值存储在数据库中。

参考:http://php.net/manual/en/function.html-entity-decode.php


如果您想将数据库中的值存储为编码的 HTML 实体,那么您可以通过获取用户正在搜索的任何值并对其进行编码来搜索这些值。 (这可能不清楚)。

如果用户正在搜索“Mr. & Mrs. Smith”,您可以使用 PHP 的 htmlentities 函数对其进行编码,以返回:

 Mr. & Mrs. Smith

并将其用作搜索字符串。

这种方法的缺点是有多种方法可以对同一个字符进行编码。 htmlentities 编码字符串的方式可能与网页上所做的不匹配。有些字符可能根本没有被编码,等等。

【讨论】:

  • 那么,您认为使用html_entity_decode 再次抓取它们会更好吗?因为我也想在我的数据库中更新这些电影(不仅仅是用户正在搜索的内容)
  • @mOna:如果你想更新数据库中的现有值,没有 MySQL 内置函数(我知道)可以解码 HTML 实体。您可以在客户端应用程序中执行此操作;运行查询以检索行的主键以及要更改的列,通过html_entity_decode 运行列值,然后发出更新(根据主键将列设置为新值)。这会让你得到与再次抓取相同的结果。
  • 谢谢,那你的意思是我应该改变这部分吗? $stmt = $conn->prepare('SELECT DISTINCT movieName FROM star_film WHERE movieName LIKE :term limit 0, 10');$stmt->execute(array('term' => '%'.$_GET['term'].'%'));while($row = $stmt->fetch()) {$return_arr[] = $row['movieName'];}
  • 我将我的代码更改为:$return_arr[] = html_entity_decode($row['movieName'], ENT_QUOTES, "ISO-8859-1");,但是我在文本框中输入“wall.e”或输入“WALL &middot ; E”都找不到 Wall.E ,我刚写墙时在搜索结果中找到了它...但是,我找不到任何形式的打字史密斯先生和夫人。有什么我错过的吗?
  • 不,如果您想将 html 实体留在数据库中,并且您想搜索它,您可以通过 @987654336 运行用户提供的搜索词 $_GET['term'] @ 功能。因此,对于“Mr. & Mrs. Smith”的搜索词,您的查询最终将等同于 WHERE movieName LIKE '%Mr. & Mrs. Smith%'。但是这种方法不适用于 'wall.e'WALL-E ...句点和破折号将 not编码为·
【解决方案2】:

如果您不介意单独处理每个角色,您可以对每个角色执行此操作:

UPDATE movies SET movie_title = REPLACE(movie_title, '·', '·');

也就是说,如果您想用实际字符替换 HTML 实体。如果您只想从当前电影标题中删除难以键入的字符,只需使用 '' 代替。不过,在使用 REPLACE 对数据库进行核对之前,请务必进行备份。

您可能想要创建一个新列,例如movie_easytype_title,您可以在其中存储易于键入和匹配的标题版本,同时仍保留正确的完整标题以供显示。

在将标题输入数据库之前,您可能应该在标题上运行html_entity_decode,以避免存储麻烦的 HTML 实体。

【讨论】:

  • 那么您认为这次使用html_entity_decode 重新抓取它们更好吗?
  • 嗯,这取决于您在追踪每个需要替换的字符方面的耐心。我只会重新索引,除非它是大量文件,并且重新索引需要很长时间。
  • 抱歉,我无法选择两个答案作为正确答案,所以我选择了第一个作为答案,我唯一能做的就是投票,但无论如何非常感谢您的时间和有用的评论: )
  • @mOna 谢谢,重要的是你把你的东西整理好了。 :)
【解决方案3】:

这些解决方案听起来很奇怪,我也知道它是用于 url 编码和解码的。但它有效。
在将数据插入数据库时​​,您可以使用 urlencode()
在显示它时,您应该使用 urldecode()

【讨论】:

  • urlencode()urldecode() 不处理 HTML 实体,它们处理 %20 等十六进制字符。 "解码给定字符串中的任何 %## 编码。加号 ('+') 被解码为空格字符。"
  • @MarkusAO 我并不是说只使用一个功能。假设您的数据是H+N,那么在数据库中它看起来像H%2BN,而在网页上它是H+N
  • 只有在 URL 编码开始时才会看起来像这样,不是吗。当通过GET 变量接收数据时,urldecode 是相关的,否则不太可能对某些内容进行 URL 编码,除非您正在收集标签的 href/src 属性或类似的东西。当然,以防万一,urldecoding 无害。
猜你喜欢
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2011-12-28
  • 2016-10-19
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
相关资源
最近更新 更多