MySQL服务端必须配置utf8mb4字符集与utf8mb4_unicode_ci排序规则,否则emoji和生僻字会截断;需修改my.cnf/my.ini的[mysqld]段并重启,再逐库逐表转换,同时确保连接层三处字符集均为utf8mb4。
MySQL 服务端默认字符集设为
不改
配置文件
,
时指定
只能保单库,新库、系统库、临时表仍可能掉坑里。必须从服务层统一兜底。
编辑
(Linux)或
(Windows),在
段下加两行:
注意:不能写成
——MySQL 的
是阉割版,最多存 3 字节字符,emoji 和部分生僻汉字会截断或报错。
不可靠:对 SUPER 权限用户不生效,且无法影响
系统库初始化
重启 MySQL 后用
验证是否生效
如果用 Docker,需挂载自定义配置文件,不能只靠
设置
已有数据库和表批量转成
改完服务端配置只是起点。老库老表的字符集仍是
或
,字段存了四字节字符会乱码甚至报错
。
转换分三步,顺序不能错:
先改库:
再改每张表:
最后单独检查
/
字段长度——
单字符最多占 4 字节,若原字段定义为
且用了
,实际最大字节数是 1020,但 InnoDB 行长度限制仍按 65535 算,极端情况下可能触发
别跳过
:只用
改字符集,不会重
编码
已有数据,旧乱码还是乱码。
下连接层必须同步设置
服务端和表都改了,应用连上去还是存乱码?大概率是客户端没对齐。MySQL 连接有三层字符集:服务端、连接层、结果集。其中连接层(
/
)决定 SQL 文本如何解码。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
常见错误场景:
PHP
没调
,或 PDO DSN 漏了
Java JDBC URL 缺
(注意是
,不是
)
命令行
进去后,
只对当前会话有效,退出即失效
验证连接层是否到位:
中
、
、
三项必须都是
。
为什么
比
更值得选
是 MySQL 5.7 以前的默认排序规则,性能稍快但精度低:它把带重音的字母(如
和
)当成等价,大小写也不严格区分,搜
可能命中
,线上查不到数据时容易懵。
基于 Unicode 4.0 标准,排序和比较更符合现代语言习惯。MySQL 8.0+ 已默认用
(大小写敏感 + 重音敏感),但 5.7/8.0 兼容场景下,
是最稳的过渡选择。
建库建表时不显式指定 collation,会继承 server 层的
,所以配好
很关键
已用
的老表,
时会自动升级 collation,不用额外改
如果业务强依赖大小写敏感(比如密码哈希校验),得用
或 MySQL 8.0+ 的
规则
真正麻烦的是跨版本迁移:MySQL 5.7 的
和 8.0 的
排序结果不一致,做主从或备份还原前得核对 collation 是否兼容。
utf8mb4CREATE DATABASECHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_cimy.cnfmy.ini[mysqld][mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ciutf8utf8init_connectmysqlSHOW VARIABLES LIKE 'character_set_server';ENVutf8mb4latin1utf8Incorrect string valueALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;TEXTVARCHARutf8mb4VARCHAR(255)utf8mb4Row size too largeCONVERT TOMODIFY COLUMNutf8mb4character_set_clientcharacter_set_connectionmysqliset_charset('utf8mb4');charset=utf8mb4useUnicode=true&characterEncoding=utf8mb4utf8mb4utf8mysql -u root -pSET NAMES utf8mb4;SHOW VARIABLES LIKE 'character_set%';clientconnectionresultsutf8mb4utf8mb4_unicode_ciutf8mb4_general_ciutf8mb4_general_ciéecafecaféutf8mb4_unicode_ciutf8mb4_0900_as_csutf8mb4_unicode_cicollation-servercollation-server = utf8mb4_unicode_cigeneral_ciCONVERT TOutf8mb4_bin_as_csutf8mb4_unicode_ciutf8mb4_0900_as_cs