直接改数据库字符集仅影响新建表,已有表及字段字符集不变;必须先执行ALTER DATABASE设默认值,再用ALTER TABLE ... CONVERT TO逐表转换结构和数据。
直接改数据库字符集不等于表和字段都生效
navicat 里右键数据库 →「编辑数据库」→ 改 字符集,只影响后续新建的表,已有表的 default charset 和字段的 character set 完全不变。很多用户改完以为万事大吉,结果插入 emoji 或中文仍报错,根源就在这儿。
用 ALTER DATABASE + ALTER TABLE ... CONVERT TO 才算真正批量生效
必须分两步走:先改库级默认值,再逐表转换结构和数据。单条语句无法跨库操作,所以得拼 SQL 批量生成:
-
ALTER DATABASE your_db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;(设新表默认) - 查出所有目标表:
SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') FROM information_schema.tables WHERE table_schema IN ('db1', 'db2'); - 复制结果,在查询窗口中一次性执行——注意别漏掉反引号,表名含横线或数字开头时会报语法错误
结构同步功能在跨平台迁移时容易丢字符集配置
Navicat 的「结构同步」默认只比对字段类型、索引、外键,CHARACTER SET 和 COLLATE 不在默认检测项里。如果你从 MySQL 同步到 MariaDB 或低版本 MySQL,即使源表是 utf8mb4,目标端可能被强制降为 utf8。
解决办法:
- 同步前点开「选项」→ 勾选
Compare character set and collation - 手动检查同步预览里的每张表,确认
CONVERT TO行是否出现(不是只有DEFAULT CHARSET) - 若目标库不支持
utf8mb4_unicode_ci(比如老版本 MySQL 5.5),得换成utf8mb4_general_ci,否则同步直接失败
SQL 文件执行时最常踩的三个坑
导出 SQL 文件再运行看似稳妥,但实际极易翻车:
- 文件编码不是 UTF-8 BOM,Navicat 导入时把中文注释或字段值当乱码,导致
SET NAMES失效 - SQL 文件里混着
CREATE DATABASE语句,而你只想改表——执行时可能误删重建整个库 - 没加
DELIMITER就直接贴含存储过程的脚本,Navicat 把分号当语句结束,报错You have an error in your SQL syntax
真正安全的做法:用 Navicat 查询窗口直接粘贴纯 ALTER TABLE ... CONVERT TO 语句,禁用自动提交,每执行 5 张表就手动 COMMIT 一次——这样出问题能立刻回滚,不会卡死整个连接。


















