PHP PDO连接MySQL读取数据出现�、Â字符乱码问题如何解决?
PHP+MySQL乱码问题解决方案
核心原因
你遇到的乱码本质是全链路字符集不统一导致的:Â是UTF-8编码的多字节字符被单字节编码(ISO-8859-1)解析的产物,�是不符合UTF-8编码规则的字节被UTF-8解析时的替换字符。既有代码错误,也可能存在服务器配置不匹配的情况,按以下步骤逐一修改即可彻底解决:
修复步骤
1. 修正PDO连接的字符集配置(最核心的代码错误)
你当前DSN中的字符集写法完全不生效,;utf8不是合法的PDO参数,正确的参数名为charset,修改后的DSN如下:
// 推荐用utf8mb4替代utf8,兼容emoji等4字节UTF-8字符 private $dsn = 'mysql:host=' . self::DBHOST . ';dbname=' . self::DBNAME.';charset=utf8mb4'; public function __construct(){ try{ $this->dbConnection = new PDO($this->dsn, self::DBUSER, self::DBPASS); $this->dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); // 额外加一句设置连接编码,兼容性更强 $this->dbConnection->exec("SET NAMES utf8mb4 COLLATE utf8mb4_general_ci"); }
2. 统一前端输出编码
删除ISO-8859-1的header配置,固定使用UTF-8编码输出:
<?php header("Content-Type: text/html; charset=utf-8");?>
你当前的meta标签配置无需修改,保持即可。
3. 统一数据库层字符集
- 现有字段的
utf8_general_ci可正常使用,推荐统一改为utf8mb4_general_ci,避免emoji等特殊字符存储失败 - 检查线上MySQL配置文件(my.cnf/my.ini),确保以下配置,修改后重启MySQL服务:
[client] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_general_ci
4. 检查文件编码
确保所有PHP、HTML、JS等源码文件都用UTF-8无BOM格式保存,避免文件本身携带异常编码字符。
5. 检查Web服务器配置
- Nginx:确认配置中无其他charset配置冲突,可添加
add_header Content-Type "text/html; charset=utf-8";统一输出编码 - Apache:确认httpd.conf中
AddDefaultCharset配置为UTF-8,不要设置为ISO-8859-1等其他编码
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

