Navicat中修改已有表字符集应进入“设计表”→切换至Options选项卡→修改Default Character Set和Default Collation;但该操作仅影响新字段,默认不变更已有字段字符集,全表(含数据)统一转换须执行ALTER TABLE ... CONVERT TO CHARACTER SET语句。
Navicat里修改已有表的字符集用哪个操作?
直接在表设计界面改——不是右键菜单,也不是建库时的选项。选中目标表 → 右键 → 设计表 → 切到 options 选项卡 → 修改 default character set 和 default collation。
注意:Default Character Set 改的是新字段的默认值,不会自动转换已有字段;真正让全表(含已有字段)统一变字符集,得靠 SQL 命令 ALTER TABLE ... CONVERT TO CHARACTER SET。
- 如果只改
Options里的设置,后续新增字段才用新字符集,老字段仍保持原样 -
CONVERT TO会重编码所有字段数据,但要求字段本身支持目标字符集(比如TEXT字段没问题,CHAR(10)在 latin1 下存了中文再转 utf8mb4 可能截断) - 执行前务必备份,尤其当表里已有中文或 emoji 时
为什么改完表字符集,字段还是 latin1?
因为 MySQL 的字符集是分层继承的:数据库 → 表 → 字段。改表级默认值,不等于改字段级定义。
字段的字符集是在创建时固化下来的,除非显式修改字段定义,否则不会随表默认值变化。常见错误是以为改了表就一劳永逸,结果 SHOW CREATE TABLE 一看,字段还是 latin1。
- 查字段实际字符集:
SHOW FULL COLUMNS FROM table_name,看Collation列 - 单个字段改字符集:
ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci - 批量改所有
VARCHAR字段:得写脚本生成 ALTER 语句,Navicat 不提供一键全表字段重设功能
Navicat 新建表时怎么让字段默认用 utf8mb4?
新建表时,只要数据库和表都设了 utf8mb4,默认字段就会继承它——但前提是建表时不手动覆盖字段字符集。
在 新建表 界面,每个字段下方有 Collation 下拉框。如果这里空着,它会按表默认值来;一旦你点开选了 latin1_swedish_ci,这个字段就脱离继承了。
- 最稳妥做法:建表前先确认数据库和表的字符集已是
utf8mb4,然后字段的Collation保持为空(显示为“default”) - 如果字段类型是
TEXT或MEDIUMTEXT,即使表默认是 latin1,它们也可能被强制用服务器默认字符集,行为不稳定,别依赖 - emoji 必须用
utf8mb4+utf8mb4_*排序规则,utf8(即 utf8mb3)不支持 4 字节字符
外键字段字符集不一致会导致保存失败
Navicat 点“保存”后外键消失,十有八九是引用字段和被引用字段字符集不同。MySQL 要求外键列与父表对应列字符集、排序规则完全一致,差一个下划线都不行。
比如父表字段是 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,子表字段却是 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,外键就建不上。
- 检查两字段字符集是否完全相同:
SHOW FULL COLUMNS FROM table_name对比Collation - 修复方法:统一用
utf8mb4_unicode_ci或utf8mb4_0900_ai_ci(MySQL 8.0+ 推荐) - 别忽略排序规则差异,
_ci和_cs不兼容,_unicode_ci和_general_ci也不兼容


















