MySQL僧伽罗语字符数据库转utf8mb4_general_ci问题求助
解决僧伽罗语数据库转utf8mb4_general_ci的乱码问题
核心问题分析
你遇到的乱码不是单纯修改表字符集能解决的——数据在导入时已经被错误编码(按拉丁字符集解析僧伽罗语),直接改字符集只会保留乱码状态,必须先修复数据的编码再统一转换。
方法一:重新导出导入(最可靠,适用于已乱码的数据)
1. 备份当前乱码数据(原样导出字节)
用latin1字符集导出,确保乱码的原始字节不被二次转换:
mysqldump -u 你的用户名 -p --default-character-set=latin1 你的数据库名 > srilanka_backup.sql
2. 修改备份文件的编码声明
打开srilanka_backup.sql,批量替换以下内容:
- 把
SET NAMES latin1;替换为SET NAMES utf8mb4; - 把所有
CHARSET=latin1替换为CHARSET=utf8mb4 COLLATE utf8mb4_general_ci
3. 准备目标数据库
创建或修改数据库为utf8mb4格式:
-- 新建数据库(可选) CREATE DATABASE 新数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 或修改现有数据库 ALTER DATABASE 你的数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
4. 重新导入修复后的备份
用utf8mb4字符集导入,确保僧伽罗语被正确解析:
mysql -u 你的用户名 -p --default-character-set=utf8mb4 你的数据库名 < srilanka_backup.sql
方法二:修复现有表数据(仅适用于双重编码乱码场景)
如果数据是“utf8僧伽罗语被当成latin1导入”导致的乱码,可直接转换列编码修复:
1. 对每个有问题的表和列执行:
-- 先把列转成latin1(还原原始字节) ALTER TABLE 表名 MODIFY COLUMN 列名 列类型(比如VARCHAR(255)) CHARACTER SET latin1; -- 再转成utf8mb4(正确解析僧伽罗语) ALTER TABLE 表名 MODIFY COLUMN 列名 列类型 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
2. 批量修改所有表的默认字符集:
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
后续预防措施
修改MySQL配置文件(my.cnf/my.ini),强制全局utf8mb4编码,避免后续操作再出问题:
[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci
内容的提问来源于stack exchange,提问作者Dimuth Nanayakkara
相关产品推荐
相关产品推荐

