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中,先批量转换表字符集:
- 进入目标数据库,点击「操作」选项卡,设置数据库字符集为
utf8mb4,排序规则为utf8mb4_unicode_ci。 - 选中所有表,点击「批量操作」→「更改表属性」,设置字符集为
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
相关产品推荐
相关产品推荐

