小皮面板数据库备份恢复乱码如何处理
学完这篇你能得到什么:你能自己判断小皮面板(phpStudy/小皮面板)里数据库备份、恢复出现乱码是发生在哪一环,并用命令行把备份导对、把数据完整恢复回来。
乱码几乎从来不是"面板坏了",而是导出、传输、导入三个环节中,字符集声明和数据实际字节对不上。下面按顺序排查一遍即可。
第一步:先分清是「显示乱码」还是「数据真乱码」
这一步要确认数据到底是存坏了还是只是看起来坏,结果决定后面走哪条路。
登录服务器,进 MySQL 命令行看一眼原始字节:
mysql -uroot -p -e "SELECT id, HEX(name) FROM 你的库.你的表 LIMIT 3;"
- 如果 HEX 是
E4B8ADE69687这种(UTF-8 中文"中文"的字节),说明数据本身没坏,只是 phpMyAdmin 或网页连接层用了 latin1 显示,改连接字符集就行。 - 如果 HEX 是
C3A4C2B8C2AD这类"双重编码"特征,那才是真乱码,要走到第六步。 - 如果 HEX 是
D6D0CE C4这种 GBK 字节,说明数据是用 GBK 存进来的。
注意:不要一看到乱码就删库重装。先把 HEX 结果复制下来,它决定了后面每一步的方向。
第二步:查清库、表、列三层的字符集
这一步搞清楚"声明"和"实际"差在哪。三条命令依次执行:
SHOW CREATE DATABASE 你的库;
SHOW TABLE STATUS FROM 你的库;
SHOW FULL COLUMNS FROM 你的库.你的表;
重点看 Collation 一列。常见情况是库是 utf8mb4_general_ci,但某张老表还是 latin1_swedish_ci,恢复时就会被"翻译"一遍,于是乱码。
第三步:导出时显式指定字符集
这是最容易出错的一步。不要用面板默认的"导出"按钮直接下 SQL 文件,用 mysqldump 并明确字符集:
mysqldump -uroot -p \
--default-character-set=utf8mb4 \
--set-charset \
--single-transaction \
--databases 你的库 > db.sql
--set-charset 会在文件头部写入 SET NAMES utf8mb4,导入端就不会猜错。
特殊情况:如果第二步发现表是 latin1、数据实际是 UTF-8 字节(常见于老站迁移),要反过来用 --default-character-set=latin1 --skip-set-charset 导出,把原始字节原样保存下来,再在导入端转换。
第四步:检查并修正 SQL 文件本身
这一步确认文件没被编辑器二次污染。
head -3 db.sql # 看是否有 SET NAMES utf8mb4
file -i db.sql # 看文件实际编码
如果文件是 GBK,先转换:
iconv -f GBK -t UTF-8 db.sql -o db_utf8.sql
如果需要替换文件头的字符集声明:
sed -i 's/SET NAMES latin1/SET NAMES utf8mb4/g' db.sql
注意:千万别用 Windows 记事本"另存为 UTF-8",它会加 BOM 头,导入时直接报
ERROR 1064语法错误。要改内容就用 VS Code,右下角编码选 UTF-8,保存格式选「无 BOM 的 UTF-8」。
第五步:导入时同样指定字符集
mysql -uroot -p --default-character-set=utf8mb4 你的库 < db.sql
如果坚持用面板:左侧菜单「数据库」→ 找到目标库 → 点右侧「管理」打开 phpMyAdmin → 顶部「导入」→ 选择文件后,把「字符集」下拉框从默认的 utf-8 改成 utf8mb4,格式保持 SQL,然后点「执行」。
注意:导入前先确认目标库是空的或已备份。导入不会自动清空旧表,会出现重复主键报错,让人误以为是乱码问题。
第六步:修复已经乱码的数据
如果是"latin1 存了 UTF-8 字节"这一种,用 binary 中转法修复,以单列为单位操作最稳:
ALTER TABLE 你的表 MODIFY name VARCHAR(255) CHARACTER SET binary;
ALTER TABLE 你的表 MODIFY name VARCHAR(255) CHARACTER SET utf8mb4;
整表一起修就把 MODIFY 换成:
ALTER TABLE 你的表 CONVERT TO CHARACTER SET utf8mb4;
注意:
ALTER不可逆,执行前先做一次mysqldump全库备份。另外文本列若有索引或外键,建议在业务低峰期做。
第七步:改掉默认字符集,防止下次再犯
编辑 MySQL 配置文件(小皮面板:左侧「软件管理」→ MySQL → 「配置修改」;Windows 版 phpStudy 在 Extensions/MySQL5.7.26/my.ini):
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
保存后重启 MySQL。
注意:改
character-set-server只影响新建的库表,已有库表必须手动ALTER转换,否则老问题依旧。
小结
- 先用
SELECT HEX()判断是真乱码还是显示乱码,别急着动手。 - 导出用
mysqldump --default-character-set=utf8mb4 --set-charset,导入也用--default-character-set=utf8mb4,两头对齐。 - 老站迁移时,latin1 存储 + UTF-8 字节的组合要用 latin1 导出、utf8mb4 导入来转码。
- 修数据用
CHARACTER SET binary中转,操作前必备份。 - 最后把
my.cnf的默认字符集统一改成 utf8mb4,从源头断掉这类问题。
原文链接:https://www.gj0.com/thread-756.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。