还原后中文变问号的根本原因是Navicat还原时跳过字符集协商,将utf8mb4字节按latin1/gbk硬解;必须在还原前执行SET NAMES utf8mb4,并确保连接、库、表、字段四级字符集均为utf8mb4。
还原后中文变问号,不是备份文件坏了,而是 navicat 在还原过程中跳过了字符集协商,把 utf8mb4 字节按 latin1 或 gbk “硬解”了。
SET NAMES utf8mb4
Navicat 的「还原」功能(无论是从 .sql 文件还是备份集)不会自动执行连接初始化命令,它直接读取文件字节并发送给服务端——如果当前连接的 character_set_client 是 latin1,哪怕数据库和表全是 utf8mb4,也会错解。
SET NAMES utf8mb4;
还原只是“写入动作”,真正决定能否正确显示的,是目标库/表/字段是否真正在用 utf8mb4。只改其中一层没用,必须逐级验证。
SHOW VARIABLES LIKE 'character_set_database'; —— 若不是 utf8mb4,说明新表会继承错误编码SHOW CREATE TABLE `your_table`; —— 重点看末尾是否有 DEFAULT CHARSET=utf8mb4
SHOW FULL COLUMNS FROM `your_table`; —— 每个字段的 Collation 列必须是 utf8mb4_unicode_ci 类型,不能是 latin1_swedish_ci
TEXT、MEDIUMTEXT 等类型不被 CONVERT TO 覆盖,需单独 MODIFY,例如:ALTER TABLE `t` MODIFY `content` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
即使你执行了 SET NAMES utf8mb4,如果 Navicat 连接本身的字符集配置没对齐,后续新建查询或自动重连仍会回落到错误值。
utf8mb4(不是 utf8)SHOW VARIABLES LIKE 'character_set%'; 确认 character_set_client、character_set_connection、character_set_results 全部是 utf8mb4
最容易被忽略的是:还原动作本身不触发任何字符集自动适配,它完全信任当前连接的 client 编码。哪怕你数据库、表、字段全设对了,只要还原时连接用的是 latin1,写进去的就是错的字节,之后怎么查都是问号。