虽然我将我的web应用程序设置为完全符合UTF8,但我忘记在PDO设置中指定UTF-8字符集…虽然在我的web应用程序中看起来很好,但在数据库/phpmyadmin (ä½¥½for)中,中文字符看起来很奇怪。
当我终于知道解决方案(在PDO连接设置中添加字符集)时,我想知道是否有一种简单的方法将我的旧数据转换为适当的UTF-8。我在Stackoverflow上找到了下面的代码来完成这项工作,但它解决了每列、每表的编码问题。
UPDATE tablename SET
field = CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8);
是否存在一种方法来执行这种转换到整个数据库?
我确定我的MySQL数据库/表已经配置为使用字符集UTF-8。
谢谢!
你有"双重编码"。我相信这些步骤"导致"了它:
- 要存储的字节(例如
你好
)被正确编码为utf8 (E4BDA0 E5A5BD
)。 - 列的
CHARACTER SET
正确为utf8(或utf8mb4)。(也可以是latin1,结果相同) - 当您
INSERTed
时,"连接"被设置为latin1。这就是错误所在。它声明存储的数据被编码为latin1,这6个字符:十六进制E4 BD A0 E5 A5 BD
。在存储期间,它们被转换为列字符集(utf8)以成为C3A4 C2BD C2A0 C3A5 C2A5 C2BD
。 - 您正确地将数据
SELECTed
为utf8。但是,到目前为止,这给了你这个烂摊子:你好
.
有两点是错的;这两个需要同时修复:
- 步骤2需要更改以确定UTF-8是客户端的编码。看到PHP 。为PDO设置
$db = new PDO('dblib:host=host;dbname=db;charset=UTF8', $user, $pwd);
。 - 数据需要修复。您的
UPDATE
看起来很适合这个案例。