修复通过PDO编码的数据库,而不指定UTF8字符集

时间:2016-09-30 11:33:40

标签: php mysql pdo utf-8

虽然我将我的网络应用程序设置为完全符合UTF8,但我忘了在PDO设置中指定UTF-8字符集...碰巧中文字符在数据库/ phpmyadmin中看起来很奇怪(ä½å¥ ½为你好),虽然他们在我的网络应用程序中看起来很好。

当我终于知道解决方案(在PDO连接设置中添加字符集)时,我想知道是否有一种简单的方法将旧数据转换为正确的UTF-8。我在Stackoverflow上找到了以下执行此任务的代码,但它解决了每列的编码问题列,每个表的表..

UPDATE tablename SET
field = CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8);

是否存在执行此类转换到整个数据库的方法?

我确切地说我的MySQL数据库/表已经配置为使用charset UTF-8。

谢谢!

1 个答案:

答案 0 :(得分:1)

你有“双重编码”。我相信这些步骤'造成'它:

  1. 要存储的字节(例如,你好)已正确编码为utf8(E4BDA0 E5A5BD)。
  2. 列的CHARACTER SET正确为utf8(或utf8mb4)。 (可能是latin1,结果相同。)
  3. INSERTed时,“连接”设置为latin1。这就是错误所在。这表明存储的数据被编码为latin1,这6个字符:hex E4 BD A0 E5 A5 BD。在存储期间,它们被转换为列charset(utf8)变为C3A4 C2BD C2A0 C3A5 C2A5 C2BD
  4. 您正确SELECTed数据为utf8。但是,到现在为止,这给了你一团糟:你好
  5. 有两件事是错的;两者都需要同时修复:

    • 第2步需要更改以确定UTF-8是客户端的编码。见PHP。对PDO执行类似$db = new PDO('dblib:host=host;dbname=db;charset=UTF8', $user, $pwd);的操作。
    • 数据需要修复。您的UPDATE看起来很适合案例。