从php5.6升级到php7.0时,utf8编码中断

时间:2016-05-30 05:36:00

标签: php mysql utf-8

我有一个简单的(自定义)CMS接受降价并将其显示在网页中。在php5.6中工作正常(在ubuntu 15.10上使用ondrej / php5 ppa)。 Mysql排序规则设置为utf8无处不在。

将服务器升级到php7.0(ondrej / php)并显示乱码。我尝试将相关的mysql表和字段迁移到utf8mb4 / utf8mb4_unicode_ci但没有运气。

降级到php5.6,一切正常。 我有预感这是一些我不知道的奇怪的PHP设置? php.ini default_collat​​ion = UTF-8。找不到其他有用的东西。 phpMyAdmin显示垃圾无论什么版本的PHP或服务器设置,所以它没有太大的帮助。  我接下来可以尝试什么?

源文本(从php5.6呈现的页面复制)

아동 보호 정책에 대한 규정
This Code is part of the

渲染输出(来自php7和phpMyAdmin)

ì•„ë™ ë³´í˜¸ ì •ì±…ì— ëŒ€í•œ ê·œì •
This Code is part of the

1 个答案:

答案 0 :(得分:1)

使用此选项将表格更改为utf8mb4:

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4 COLLATION utf8mb4_unicode_520_ci;

但是,如果表已经搞砸了,那么这将无法修复它。请执行以下操作以验证:

SELECT col, HEX(col) FROM tbl WHERE ...

例如,아동 보호 정책에 대한 규정会显示EC9584 EB8F99 EBB3B4 ED98B8 ECA095 ECB185 EC9790 EB8C80 ED959C EAB79C ECA095的十六进制。 (请忽略这些空格。)

对于韩语文本,您应该看到(大多数)Ewxxyy形式的3个十六进制字节组,其中w是A或B或C或D,如上例所示。十六进制20(仅1个字节)表示空格。

ì•„ë™ ë³´í˜¸ ì •ì±…ì— ëŒ€í•œ ê·œì •是Mojibake。这意味着某个地方latin1错误地参与其中,可能是在您INSERTed文本时。在这种情况下,您会看到类似C3AC E280A2 E2809E C3AB C28F E284A2 C3AB C2B3 C2B4 C3AD CB9C C2B8 ...的内容 - 大多数是2字节Cwxx十六进制。

如果您看到,UPDATE之类的内容会修复数据: CONVERT(BINARY(CONVERT(CONVERT(col USING utf8mb4) USING latin1)) USING utf8mb4) (修改:已移除对UNHEX的通话。)