迁移至MySQL 8.0.31后印地语/天城文内容显示异常求助
解决MySQL 8.0迁移后天城文/印地语内容丢失问题
问题根源
MySQL 5.7中的utf8实际是utf8mb3(仅支持3字节Unicode字符),迁移到8.0后该字符集被显式标注为utf8mb3。直接通过ALTER TABLE修改表/列字符集为utf8mb4时,若迁移过程已出现编码不匹配(比如连接字符集设置错误),会导致原有天城文数据被错误转码,最终丢失或乱码。
修复步骤
1. 备份当前数据(必做)
先导出新服务器上的现有数据库,避免操作失误导致数据彻底丢失:
mysqldump -u [用户名] -p --default-character-set=utf8mb3 [数据库名] > backup_utf8mb3.sql
2. 创建新的utf8mb4数据库
在MySQL 8.0中创建字符集为utf8mb4的目标数据库:
CREATE DATABASE [新数据库名] CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 重新导入数据并完成转码
使用utf8mb4字符集导入备份文件,让MySQL自动完成从utf8mb3到utf8mb4的安全转码:
mysql -u [用户名] -p --default-character-set=utf8mb4 [新数据库名] < backup_utf8mb3.sql
如果有旧服务器的原始备份(从MySQL 5.7导出的),直接用原始备份导入效果更好,导出时指定--default-character-set=utf8即可。
4. 修正数据库连接配置
PHP连接数据库时必须指定utf8mb4字符集,禁止使用utf8(MySQL 8.0中utf8仍对应utf8mb3):
- mysqli示例:
$conn = mysqli_connect('localhost', [用户名], [密码], [新数据库名]); mysqli_set_charset($conn, 'utf8mb4');
- PDO示例:
$dsn = 'mysql:host=localhost;dbname=[新数据库名];charset=utf8mb4'; $pdo = new PDO($dsn, [用户名], [密码]);
5. 验证字符集配置
导入完成后,检查表和列的字符集是否正确:
-- 查看表的字符集设置 SHOW CREATE TABLE [表名]; -- 查看列的字符集和排序规则 SHOW FULL COLUMNS FROM [表名];
确保存储天城文内容的列,字符集为utf8mb4,排序规则为utf8mb4_unicode_ci。
6. 前端配置(保持统一)
- 页面头部保留UTF-8 meta标签:
<meta charset="UTF-8"> - PHP输出响应头:
header('Content-Type: text/html; charset=utf-8'); - 确保页面使用支持天城文的字体(如
Noto Sans Devanagari)
内容的提问来源于stack exchange,提问作者Dr M L M J
相关产品推荐
相关产品推荐

