【问题标题】:How to convert wrongly encoded data to UTF-8?如何将错误编码的数据转换为 UTF-8?
【发布时间】:2013-11-22 18:21:35
【问题描述】:

我正在处理旧 mysql 数据库中的数据。此数据库中有一个表,其中包含一个字符串列,其编码设置为“cp1252 West European (latin1)”(与 Windows-1252 相同)。从 mysql 命令提示符查询数据时,该字段的数据表示为:

Obama’s

这应该是阅读

Obama’s

我已尝试按照How to convert an entire MySQL database characterset and collation to UTF-8? 的公认答案在 MySQL 中将该字段转换为 UTF-8,但没有区别。

我还尝试在该表中插入一个新行,使用 Obama’s 作为该字段的文本(同样,来自 mysql 命令提示符)。但是,当我查询刚刚插入的同一行时,此文本会正确表示。我尝试在字段设置为 latin1 和设置为 UTF-8 时执行该插入。结果一样。

这让我相信当坏数据插入数据库时​​,它首先被 PHP 错误编码。这就是让我感到困惑的地方。

我可以假设数据是通过 Web 表单插入并使用 PHP 处理的。 PHP 在将其插入数据库之前对其做了什么?它是否将字符串转换为 UTF-8,根据table on this helpful page,使用三个字节%E2 %80 %99 来表示 字符。我有这个权利吗?

如果正确,我有哪些方法可以修复这些数据?我想将表格及其字段转换为 UTF-8 编码,但这似乎并不能修复文本。我是否必须编写一个脚本来手动将这些字符更改为应有的字符?

【问题讨论】:

  • 此处描述了导致此问题的问题:Handling Unicode Front To Back In A Web App。连接编码很可能设置为latin1,而实际发送的是 UTF-8 编码数据。要解决此问题,您必须说服 MySQL 获取 latin1 中当前数据的 bytes,然后将其插入为 utf8 bytes。有一个 SQL 单线 UPDATE 命令,但现在找不到。
  • 亲爱的布莱恩,请接受唯一的答案,它救了我的命

标签: php mysql character-encoding


【解决方案1】:
select convert(binary convert(field_name using latin1) using utf8) from table_name

如果显示正确,您可以进行更新。

【讨论】:

  • 是的!我希望我能对此投票 10,000 次。如此简单易行的解决方案。
  • 确实应该选择这个答案
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 2012-06-30
  • 2011-06-26
  • 2014-02-02
  • 2012-06-12
  • 2012-01-15
  • 2013-09-12
  • 2020-02-17
相关资源
最近更新 更多