You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:15:05