必须修改C:\xampp\mysql\bin\my.ini的[mysqld]段,设character-set-server=utf8mb4和collation-server=utf8mb4_unicode_ci并重启MySQL;再用命令行验证character_set_server和collation_server是否均为utf8mb4及对应排序规则,否则中文、emoji仍存不进或乱码。

必须改 my.ini 的 [mysqld] 段,否则中文、emoji 存不进、查出来是问号或报 Incorrect string value 错误——这不是 PHP 或前端的问题,根子在 MySQL 服务端默认字符集没设对。
怎么确认 MySQL 服务端字符集真改对了
别信 phpMyAdmin 界面显示,也别只看 character_set_client 或 character_set_results,它们可能被客户端临时覆盖。直接连命令行执行:
mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set_server'; SHOW VARIABLES LIKE 'collation_server';"
两个结果必须分别是 utf8mb4 和 utf8mb4_unicode_ci(或 utf8mb4_general_ci)。如果返回 latin1 或 utf8,说明配置根本没生效。
-
utf8在 MySQL 里是utf8mb3,不支持 emoji 和部分生僻汉字,不是笔误,是历史限制 - 只改
init_connect或加SET NAMES utf8mb4无法覆盖服务端默认值,还可能引发连接失败 - 用 XAMPP 控制面板「Stop → Start」才算真正重启;点「Restart」有时不彻底
改哪个文件、在哪段、写哪几行才生效
XAMPP 实际加载的配置文件是 C:\xampp\mysql\bin\my.ini(不是 conf\my.cnf,那个常被忽略)。只在 [mysqld] 段下添加或修改以下两行:
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
其他地方写了也无效,还可能出问题:
- 在
[client]或[mysql]段写character-set-server:MySQL 静默忽略 - 漏掉
collation-server:新建数据库默认排序规则仍是latin1_swedish_ci,ORDER BY可能异常 - 写成
default-character-set:该参数已废弃,且只在客户端段有效,写在[mysqld]里会导致 MySQL 启动失败 - 文件保存为带 BOM 的 UTF-8:MySQL 会启动失败,用记事本另存时选「ANSI」或「UTF-8 无 BOM」
旧库旧表为什么还是乱码?怎么安全转换
改完配置并重启后,character_set_server 是 utf8mb4 了,但已有数据库和表仍按创建时的字符集(如 latin1)存储,插入 emoji 依然报错。
先改库,再逐张改表:
ALTER DATABASE `your_dbname` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ALTER TABLE `your_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
CONVERT TO会重写整张表,大表操作前务必备份 - 如果字段有
TEXT类型且建了前缀索引(如INDEX(title(191))),需先删索引再转,否则报错Specified key was too long - 转换后,原字段定义(如
VARCHAR(255))不变,但实际可存更多 Unicode 字符
导出 SQL 或 PHP 连接时还乱码?那是另一层问题
服务端设对了,不代表导出或连接就自动用 utf8mb4:
- 命令行导出加参数:
mysqldump --default-character-set=utf8mb4 -u root -p dbname > dump.sql,且文件保存为 UTF-8 无 BOM - PHP 用
mysqli:连接后立刻调用mysqli_set_charset($conn, 'utf8mb4') - PHP 用
PDO:DSN 必须含;charset=utf8mb4,例如:mysql:host=localhost;dbname=test;charset=utf8mb4 - phpMyAdmin 要手动建库时,在「排序规则」下拉菜单中明确选
utf8mb4_unicode_ci,不能依赖安装向导自动建库
最常被忽略的是:改完 my.ini 后没重启 MySQL,或者重启了但没验证 character_set_server 是否真变了——这两个动作缺一不可。


















