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

PHPMyAdmin迁移数据库后utf8_unicode_ci转utf8mb3_unicode_ci致乱码

问题解决:MySQL迁移后utf8mb3导致多语言乱码

问题根源

MySQL 5.7中的utf8实际是utf8mb3(仅支持3字节字符),而MySQL 8.0默认的utf8mb4支持4字节字符(覆盖印地语等非英语语言)。PHPMyAdmin迁移时会严格沿用旧表的字符集定义,因此原utf8_unicode_ci的表被迁移为utf8mb3_unicode_ci,无法正确存储/显示4字节字符,导致乱码。


解决方案

1. 重新迁移(推荐,避免数据修复风险)

  • 在旧服务器(MySQL 5.7)的PHPMyAdmin中,先批量转换表字符集:
    1. 进入目标数据库,点击「操作」选项卡,设置数据库字符集为utf8mb4,排序规则为utf8mb4_unicode_ci。
    2. 选中所有表,点击「批量操作」→「更改表属性」,设置字符集为utf8mb4,排序规则为utf8mb4_unicode_ci,执行修改。
  • 导出数据库时,在导出选项中确认「字符集」选择utf8mb4,而非默认的utf8。
  • 将导出的SQL文件导入新服务器(MySQL 8.0),此时表会直接使用utf8mb4_unicode_ci。

2. 已迁移后的修复操作

如果已经完成迁移,可通过SQL命令批量修正:

  • 修正数据库级字符集:
    ALTER DATABASE 你的数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • 修正单个表:
    ALTER TABLE 你的表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • 批量修正所有表:
    执行以下SQL生成批量修改语句(替换你的数据库名):
    SELECT CONCAT('ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') AS sql_statement
    FROM information_schema.tables
    WHERE table_schema = '你的数据库名' AND table_type = 'BASE TABLE';
    
    将查询结果中的所有ALTER语句复制执行即可。

3. PHP端配套配置

确保PHP与MySQL的连接字符集统一为utf8mb4:

  • MySQLi方式:
    $conn = mysqli_connect('主机', '用户名', '密码', '数据库名');
    mysqli_set_charset($conn, 'utf8mb4');
    
  • PDO方式:
    $dsn = 'mysql:host=主机;dbname=数据库名;charset=utf8mb4';
    $pdo = new PDO($dsn, '用户名', '密码');
    
  • 网页头部添加编码声明:
    <meta charset="UTF-8">
    

内容的提问来源于stack exchange,提问作者Dr M L M J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:43:42