我有一个简单的(自定义)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_collation = UTF-8。找不到其他有用的东西。 phpMyAdmin显示垃圾无论什么版本的PHP或服务器设置,所以它没有太大的帮助。 我接下来可以尝试什么?
源文本(从php5.6呈现的页面复制)
아동 보호 정책에 대한 규정
This Code is part of the
渲染输出(来自php7和phpMyAdmin)
ì•„ë™ ë³´í˜¸ ì •ì±…ì— ëŒ€í•œ ê·œì •
This Code is part of the
答案 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
的通话。)