MySQL要真正支持中文及emoji,必须服务端、连接层、数据库、表、字段、客户端连接五层全部设为utf8mb4;需确认版本≥5.5.3,配置my.cnf的[client]、[mysql]、[mysqld]三段,重启后验证六项变量全为utf8mb4,并手动转换旧库表编码。
MySQL 要真正支持中文(尤其是带 emoji 的混合内容),光改
里的字符集还不够——必须让服务端、连接层、数据库、表、字段、客户端连接这五层全部对齐为
,缺一不可。只改
配置文件
重启,大概率还是乱码。
确认 MySQL 版本是否支持 utf8mb4
是从 MySQL 5.5.3 开始正式支持的,低于这个版本硬改配置也没用。执行:
如果返回值
,必须先升级 MySQL。别跳过这步,很多宝塔面板默认装的 MySQL 5.1 或 5.5.2 就卡在这儿。
修改 my.cnf 的三个关键区块
宝塔用户直接进【软件商店】→ 找到 MySQL → 【设置】→ 【配置修改】;非宝塔用户请编辑
或
。必须同时配置以下三处:
区块下加:
区块下加:
(注意不是
)
区块下加:
⚠️ 容易踩的坑:
这行不能少,否则客户端传来的
声明会覆盖服务端设置;
也不能写成
,必须用
才能同时设置 client/connection/results 三层。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
重启后验证六项核心变量是否全为 utf8mb4
重启 MySQL 后,进命令行执行:
输出中这六项的
列必须全是
或
。只要有一项是
或
,说明某层没生效,得回头检查配置位置或拼写(比如把
写成
就无效)。
已有数据库和表必须手动转换
配置文件改完只影响新创建的库/表,老数据不会自动转。不执行下面两步,插入中文或 emoji 仍会截断或报错:
改库:
改表(推荐用 CONVERT,它会连字段一起转):
如果表里有
或
字段且长度接近上限(比如
),转换前建议先确认字段最大长度是否够存 4 字节字符——
在
下实际最多存 255 个字符,但占用字节数翻倍,InnoDB 行大小限制可能触发
错误。
最麻烦的其实是应用连接层:PHP 要调
,Python 的
要加
参数,Java 的 JDBC URL 里不能带
(会强制降级为旧 utf8),而该用
配合自动检测。
my.cnfutf8mb4utf8mb4mysql> SELECT VERSION();< 5.5.3/etc/my.cnf/etc/mysql/my.cnf[client]default-character-set = utf8mb4[mysql]default-character-set = utf8mb4[mysqld][mysqld]character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake = 1
init_connect = 'SET NAMES utf8mb4'skip-character-set-client-handshake = 1utf8init_connectSET CHARACTER SET utf8mb4SET NAMESmysql> SHOW VARIABLES WHERE Variable_name IN (
'character_set_client',
'character_set_connection',
'character_set_database',
'character_set_results',
'character_set_server',
'collation_server'
);Valueutf8mb4utf8mb4_unicode_ciutf8latin1character-set-servercharacter_set_serverALTER DATABASE your_db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;TEXTVARCHARVARCHAR(255)VARCHAR(255)utf8mb4Row size too largemysqli_set_charset($conn, "utf8mb4")pymysqlcharset="utf8mb4"characterEncoding=utf8useUnicode=true&serverTimezone=UTC