【发布时间】: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,然后将其插入为utf8bytes。有一个 SQL 单线UPDATE命令,但现在找不到。 -
亲爱的布莱恩,请接受唯一的答案,它救了我的命
标签: php mysql character-encoding