必须修改c:\xampp\mysql\bin\my.ini的[mysqld]段,设character-set-server=utf8mb4和collation-server=utf8mb4_unicode_ci,重启后验证;旧库表需alter转换;php连接须显式指定utf8mb4 charset。

必须改 my.ini 里的 [mysqld] 段,否则重启后无效——XAMPP 实际加载的是 C:\xampp\mysql\bin\my.ini,不是 conf\my.cnf 或其他路径下的同名文件。
确认当前字符集配置是否真有问题
直接连 MySQL 命令行执行:SHOW VARIABLES LIKE 'character_set_server';SHOW VARIABLES LIKE 'collation_server';
如果返回值是 latin1 或 utf8(注意:MySQL 的 utf8 是 utf8mb3),就说明服务端默认字符集没设对。别只看 character_set_client 或 character_set_results,它们可能被客户端临时覆盖,掩盖了根本问题。
编辑 my.ini 时只动 [mysqld] 段,且必须写全两项
打开 C:\xampp\mysql\bin\my.ini,找到 [mysqld] 区块(不是 [client]、[mysql]),添加或修改以下两行:
character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci
⚠️ 容易踩的坑:
- 在
[client]段写character-set-server无效,该参数只在[mysqld]下生效 - 漏掉
collation-server,新建数据库仍会用latin1_swedish_ci - 加了
default-character-set(已废弃)或init-connect='SET NAMES utf8'(会冲突),可能导致 MySQL 启动失败 - 写成
utf8而非utf8mb4,emoji 和部分生僻中文仍存不进
重启后验证 + 补齐旧库表转换
用 XAMPP 控制面板彻底停止再启动 MySQL。立刻执行:
-
SHOW VARIABLES LIKE 'character_set_server';→ 必须返回utf8mb4 -
SHOW VARIABLES LIKE 'collation_server';→ 必须返回utf8mb4_unicode_ci
如果变了,说明配置生效;但已有数据库和表不会自动升级。要真正支持 utf8mb4,还得手动运行:
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 类型且建了前缀索引,需先删索引再转,否则可能报错“Specified key was too long”。
导出 SQL 或 PHP 连接时仍乱码?那是另一层问题
即使服务端设对了,导出命令没指定字符集,或 PHP 连接没显式声明,照样乱码:
- 命令行导出加参数:
mysqldump --default-character-set=utf8mb4 -u root -p dbname > dump.sql - PHP 用 PDO 时 DSN 必须含
;charset=utf8mb4,例如:mysql:host=localhost;dbname=test;charset=utf8mb4 - PHP 用 mysqli 时,连接后立刻调用:
mysqli_set_charset($conn, 'utf8mb4');
别信“只要服务端设了,客户端就自动适配”——MySQL 不会帮你做字符集协商,每层连接都得自己说清楚。











