PHP查询MySQL乱码主因是字符集不一致,需统一服务端、数据库、表、字段及PHP连接层为utf8mb4,并在PHP中显式设置charset=utf8mb4。
PHP 查询 MySQL 返回乱码,核心原因几乎总是字符集不一致,不是 PHP 本身“出错”,而是连接层、表结构、客户端三者之间编码没对齐。先确认 utf8mb4 是当前唯一稳妥选择,utf8(MySQL 中实际是 utf8mb3)不支持 emoji 和部分生僻汉字,强行用会丢数据或变问号。
检查 MySQL 服务端默认字符集
乱码常始于 MySQL 启动时没设对全局编码。登录 MySQL 执行:
SHOW VARIABLES LIKE 'character_set%';
重点关注:character_set_server 和 collation_server。理想值应为 utf8mb4 和 utf8mb4_unicode_ci。若不是,需修改 MySQL 配置文件(如 /etc/mysql/my.cnf 或 my.ini),在 [mysqld] 段加入:
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
改完必须重启 MySQL 服务,仅 reload 不生效。
立即学习“PHP免费学习笔记(深入)”;
确认数据库、表、字段的字符集
即使服务端设对了,旧库/表可能仍是 latin1 或 utf8。用以下语句查具体对象编码:
SHOW CREATE DATABASE `your_db`;
SHOW CREATE TABLE `your_table`;
如果结果里显示 CHARSET=latin1 或 CHARSET=utf8,必须转换: