PhpMyAdmin迁移MySQL后数据乱码/丢失问题求助
解决MySQL导出导入后的字符乱码与数据显示异常问题
问题根源
原服务器使用latin1_swedish_ci排序规则,但实际数据可能是以UTF-8编码存储在latin1字符集的表中(旧站常见场景),导出导入时未正确处理字符集映射,导致编码转换错误,出现诸如×变为×的乱码;同时可能因表结构不匹配、导入报错导致数据缺失。
解决方案
1. 重新导出原数据库(推荐,从源头规避问题)
方法1:PhpMyAdmin自定义导出
- 进入原服务器PhpMyAdmin,选中目标数据库,切换到「导出」选项卡,选择「自定义」模式
- 勾选「添加DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER语句」
- 在「字符集转换」区域,设置源字符集为latin1,目标字符集为utf8mb4(utf8mb4兼容更多Unicode字符,优先选择)
- 导出SQL文件后,打开文件修改:将开头的
SET NAMES latin1;替换为SET NAMES utf8mb4;,同时批量替换所有CHARSET=latin1为CHARSET=utf8mb4
方法2:命令行导出(更稳定)
执行以下命令导出,确保字符集参数正确:
mysqldump -u 你的用户名 -p --default-character-set=latin1 --skip-set-charset 你的数据库名 > dump.sql
同样需要编辑dump.sql,替换字符集相关配置为utf8mb4。
2. 正确导入到新服务器
- 先在新服务器创建数据库,设置字符集为
utf8mb4,排序规则为utf8mb4_unicode_ci - PhpMyAdmin导入:切换到「导入」选项卡,上传修改后的SQL文件,设置「字符集」为
utf8mb4后执行导入 - 命令行导入:
mysql -u 你的用户名 -p --default-character-set=utf8mb4 新数据库名 < dump.sql
3. 修复已导入的乱码数据(针对已存在的乱码)
如果已经导入且出现乱码,可通过SQL语句修复(先备份表再执行):
UPDATE 你的表名 SET 乱码字段名 = CONVERT(CONVERT(乱码字段名 USING latin1) USING utf8mb4);
这条语句的原理是将被错误解析为latin1的UTF-8数据,重新转换为正确的UTF-8编码。
4. 检查应用程序的数据库连接配置
以WordPress为例,打开wp-config.php,确保以下配置正确:
define('DB_CHARSET', 'utf8mb4'); define('DB_COLLATE', 'utf8mb4_unicode_ci');
如果是自定义开发的应用,确保数据库连接时设置了正确的字符集(比如mysqli扩展使用mysqli_set_charset($conn, 'utf8mb4'))。
5. 排查数据缺失问题
- 对比原库与新库的表行数,确认是真的缺失还是前端未正确渲染
- 检查原库和新库的表结构是否完全一致:包括字段类型、长度、索引、默认值等,避免因字段类型不匹配(比如TEXT被改为VARCHAR)导致数据截断
- 查看PhpMyAdmin导入时的错误日志,是否有导入失败的提示(比如主键冲突、字段过长),针对性修复后重新导入对应数据
内容的提问来源于stack exchange,提问作者Ashkan Misaghi
相关产品推荐
相关产品推荐

