必须修改my.ini的[mysqld]段并重启mysql,否则emoji插入必报incorrect string value错误;需设character-set-server=utf8mb4、collation-server=utf8mb4_unicode_ci,且旧库旧表须手动转为utf8mb4,php连接还需显式声明charset=utf8mb4。

必须改 my.ini 的 [mysqld] 段,否则 emoji 插入直接报错 Incorrect string value——光调 PHP 或客户端没用,根子在服务端默认字符集。
确认 MySQL 当前字符集是否真为 utf8mb4
别信 phpMyAdmin 界面显示或“看起来能输中文”,直接连命令行执行:
SHOW VARIABLES LIKE 'character_set_server';<br>SHOW VARIABLES LIKE 'collation_server';
两个结果必须分别是 utf8mb4 和 utf8mb4_unicode_ci(或 utf8mb4_general_ci)。如果 character_set_server 是 latin1 或 utf8(即 utf8mb3),说明配置根本没生效。
-
character_set_server = utf8mb4必须写在[mysqld]段下,写在[client]或[mysql]里完全无效 - 旧版 XAMPP 的
my.ini里常有被注释掉的character_set_server=utf8,直接取消注释并改成utf8mb4更稳妥,避免拼写错误或空格干扰 - 改完不重启 MySQL 服务 = 白改;XAMPP 控制面板里点「Stop」再「Start」,不是刷新页面
修改 XAMPP 的 my.ini 配置文件路径和写法
XAMPP 在 Windows 下实际加载的配置文件是 C:\xampp\mysql\bin\my.ini,不是 conf\my.cnf 或其他位置。编辑时只动 [mysqld] 段:
[mysqld]<br>character-set-server = utf8mb4<br>collation-server = utf8mb4_unicode_ci<br>skip-character-set-client-handshake
这几行必须独占一行、无多余空格、无中文标点。删掉所有 default-character-set(已废弃,且只对客户端生效);不要加 init_connect='SET NAMES utf8mb4'——它在 XAMPP 中容易引发连接失败,尤其搭配某些 PHP 扩展时。
-
skip-character-set-client-handshake可选但推荐:强制忽略客户端声明的字符集,防止 Navicat、CMD 等工具带错参数覆盖服务端设置 - 别在
[client]段写character-set-server,MySQL 会静默忽略,还可能报错退出 - 改完保存,检查文件编码是 ANSI 或 UTF-8 无 BOM;带 BOM 的 UTF-8 会导致 MySQL 启动失败
已有数据库和表必须手动转 utf8mb4
服务端设成 utf8mb4 后,旧库旧表仍保持创建时的字符集(通常是 latin1 或 utf8),插入 emoji 依然报错。
- 先转库:
ALTER DATABASE `your_db_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 再转表:
ALTER TABLE `your_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 如果字段定义里显式写了
CHARACTER SET latin1,仅CONVERT不够,得用MODIFY COLUMN重申字符集 - 注意索引长度限制:utf8mb4 下
VARCHAR(255)的索引可能超限(InnoDB 单列索引最大 767 字节),必要时缩字段或开innodb_large_prefix
PHP 连接必须显式声明 utf8mb4
即使 MySQL 服务端和表都设对了,PHP 默认仍用 utf8 连接,导致 mysqli_real_connect() 或 PDO DSN 未指定时,emoji 被截断或报错。
-
mysqli:连接后立刻执行
mysqli_set_charset($conn, 'utf8mb4');,不能只靠SET NAMES - PDO:DSN 中必须含
;charset=utf8mb4,例如mysql:host=localhost;dbname=test;charset=utf8mb4 - phpMyAdmin 需在
config.inc.php加$cfg['Servers'][$i]['charset'] = 'utf8mb4';,否则导出 SQL 仍可能乱码
最易忽略的一点:MySQL 5.5.3+ 才支持 utf8mb4,XAMPP 5.6+ 一般没问题,但若用极老版本(如 XAMPP 1.7.x),先升级再操作——否则配置全对也无效。











