PHP 7 从MySQL读取数据乱码,是否为UTF-8编码问题?
解决PHP 5升7后MySQL输出UTF-8特殊字符乱码的问题
这个问题我太熟了——你看到的 — 本质是UTF-8字符被错误解析成ISO-8859-1的结果,对应你期望的 — (零宽度空格+长破折号+零宽度空格)。PHP 5到7的默认行为变化导致了这个问题,咱们一步步排查修复:
1. 强制数据库连接使用UTF-8(重点!)
PHP 5可能默认会自动适配数据库编码,但PHP 7取消了这个“贴心”的默认设置,必须手动指定连接编码。别用SET NAMES utf8,直接用utf8mb4(支持所有UTF-8字符,包括emoji这类4字节字符,兼容性更好):
MySQLi 示例:
// 建立连接后立刻设置字符集 $db = mysqli_connect('localhost', 'username', 'password', 'database'); if (!$db) { die('连接失败: ' . mysqli_error($db)); } // 关键步骤 mysqli_set_charset($db, 'utf8mb4');
PDO 示例:
// 在DSN里直接指定字符集 $dsn = 'mysql:host=localhost;dbname=database;charset=utf8mb4'; $pdo = new PDO($dsn, 'username', 'password', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]);
2. 确保PHP输出的Content-Type头是UTF-8
光加meta标签不够,必须让PHP明确告诉浏览器“我输出的是UTF-8编码”。在所有输出(包括echo、HTML标签)之前添加:
header('Content-Type: text/html; charset=utf-8');
如果不想每次都写,直接修改php.ini里的default_charset配置:
default_charset = "UTF-8"
改完记得重启PHP服务。
3. 确认数据库表/字段的字符集配置
你改了排序规则utf8_unicode_ci是对的,但还要确保表和字段的字符集是utf8mb4(或至少utf8)。比如查看表结构的SQL:
SHOW CREATE TABLE your_table;
如果看到CHARSET=utf8mb4就没问题,如果是latin1或者其他,需要修改:
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_unicode_ci;
4. 验证数据本身是否正常
如果上面三步都做了还是乱码,直接在MySQL客户端(比如Navicat、phpMyAdmin)里查看对应字段的内容,确认存储的是正确的—和零宽度空格,而不是已经乱码的字符。因为如果数据本身在PHP5时代就被错误存储了,那升级后也会显示异常——不过你说PHP5下正常,大概率不是这个问题。
按这个流程走,基本能解决99%的这类编码问题。
内容的提问来源于stack exchange,提问作者nobody
相关产品推荐
相关产品推荐

