You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:27:26