查字符集用 show variables like 'character_set%' 和 show variables like 'collation%';三参数 character_set_client/connection/results 必须一致;配置需在 [mysqld] 段设置并重启;云数据库改参数组;应用连接字符串要加 charset=utf8mb4。

查当前字符集设置用什么命令
直接连上 MySQL 后执行 SHOW VARIABLES LIKE 'character_set%'; 和 SHOW VARIABLES LIKE 'collation%';,这是最准的起点。别只看配置文件,运行时可能被客户端、连接层或表级设置覆盖。
常见错误现象:建库时指定了 utf8mb4,但 character_set_client 还是 latin1,插入中文就变问号或乱码;或者 collation_server 是 utf8mb4_unicode_ci,但 collation_database 是 utf8mb4_general_ci,排序行为不一致。
-
character_set_server控制新库默认字符集,但不影响已有库 -
character_set_client、character_set_connection、character_set_results三者要一致,否则中间转码会丢数据 - MySQL 8.0 默认已是
utf8mb4,但老版本(如 5.6/5.7)默认还是utf8(实际是utf8mb3),不支持 emoji 和部分生僻汉字
修改 my.cnf 配置的关键位置在哪
不是所有段落都管用。必须在 [mysqld] 下写 character_set_server = utf8mb4 和 collation_server = utf8mb4_unicode_ci;[client] 和 [mysql] 段下加 default-character-set = utf8mb4(注意:MySQL 8.0+ 已弃用该选项,改用 charset = utf8mb4)。
容易踩的坑:[mysqld] 里漏了 init_connect='SET NAMES utf8mb4',导致普通用户连接后没自动设对三件套;或者把配置写在 [mysqld_safe] 里,完全不生效。
- 修改后必须重启 MySQL(
systemctl restart mysqld),仅重载配置不够 - 配置文件路径通常是
/etc/my.cnf或/etc/mysql/my.cnf,Docker 容器里得挂载进 /etc/mysql/conf.d/ 目录 - 如果用云数据库(如阿里云 RDS),不能改 my.cnf,只能通过控制台参数组调整
已有表和字段怎么批量转 utf8mb4
不能只改库,得逐个改表和字段。先用 ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; 改库,再对每张表执行 ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;。
性能影响明显:大表执行 CONVERT TO 会锁表、重建索引、占用磁盘空间翻倍,线上环境务必避开高峰;而且如果字段有全文索引,utf8mb4 下最大索引长度受限(767 字节 → 用 innodb_large_prefix=ON + 表格式 ROW_FORMAT=DYNAMIC 才能撑到 3072)。
- 只改字符集不改校对规则?可以,但建议统一用
utf8mb4_unicode_ci(MySQL 8.0+ 推荐utf8mb4_0900_as_cs) - 字段类型是
TEXT或VARCHAR(255)的,转完记得检查索引是否失效(SHOW INDEX FROM table_name) - 应用代码里连接字符串也要加上
?charset=utf8mb4(如 Python 的 pymysql、Java 的 JDBC URL)
PHP/Python 连接时还乱码怎么办
服务端配对了,客户端没跟上照样白搭。PHP 的 mysqli 要在连接后立刻执行 $mysqli->set_charset('utf8mb4');;PDO 则在 DSN 里加 ;charset=utf8mb4。Python 的 pymysql 必须显式传 charset='utf8mb4' 参数,mysql-connector-python 同理。
典型错误:用 mysql_query("SET NAMES utf8")(注意是 utf8 不是 utf8mb4),结果 emoji 存进去变成 ???;或者用 ORM(如 Django)时只改了 DATABASES 的 OPTIONS,却忘了在 settings.py 加 'init_command': "SET NAMES utf8mb4"。
- Node.js 的
mysql2包需在连接配置里写charset: 'utf8mb4' - Java 的 JDBC URL 示例:
jdbc:mysql://host/db?useUnicode=true&characterEncoding=utf8mb4 - 测试是否真正生效:插入一条含 emoji 的记录(如 ?),再查出来看是否原样返回
utf8 字符集写法、以及云数据库无法直接改配置文件这三点。











