MySQL字符集应设为utf8mb4:修改my.ini的[mysqld]段,设character-set-server=utf8mb4、collation-server=utf8mb4_unicode_ci,重启后验证;旧库表需ALTER转换;PHP连接须显式指定utf8mb4 charset。

确认 MySQL 当前字符集配置
直接连上 mysql 命令行,执行:
SHOW VARIABLES LIKE 'character_set%';<br>SHOW VARIABLES LIKE 'collation%';
重点看 character_set_server、collation_server 和 init_connect 的值。XAMPP 默认是 latin1 或 utf8(注意:MySQL 的 utf8 实际是 utf8mb3,不支持 emoji 等四字节字符),不能只靠客户端设置掩盖问题。
修改 my.ini 配置文件(Windows)
XAMPP 的 MySQL 配置文件路径通常是 C:\xampp\mysql\bin\my.ini(不是 my.cnf)。必须在 [mysqld] 段落下添加/修改以下几项:
character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci-
skip-character-set-client-handshake(可选,强制忽略客户端声明的字符集) - 确保没有重复的
default-character-set(该参数在较新 MySQL 中已废弃,且仅在[client]段有效,不影响服务端)
⚠️ 注意:不要在 [client] 或 [mysql] 段写 character-set-server,它只对服务端生效;也不要漏掉 collation-server,否则新建数据库默认排序规则仍是 latin1_swedish_ci。
重启 MySQL 并验证是否生效
用 XAMPP 控制面板停止再启动 MySQL 服务。重启后立刻检查:
SHOW VARIABLES LIKE 'character_set_server';<br>SHOW VARIABLES LIKE 'collation_server';
两个值必须分别是 utf8mb4 和 utf8mb4_unicode_ci。如果没变,大概率是改错了文件(比如编辑了 mysql\conf\my.cnf,但实际加载的是 bin\my.ini),或配置项写在了错误 section 下(如写在 [client] 里)。
另外,已有数据库和表的字符集不会自动升级——它们仍保持创建时的设定。要真正支持 utf8mb4,还需单独执行:
ALTER DATABASE `dbname` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;<br>ALTER TABLE `tablename` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
PHP 连接时也得同步指定 utf8mb4
即使 MySQL 服务端设好了,PHP 默认仍可能用 utf8 连接。用 mysqli 时,在 mysqli_real_connect() 后加:
mysqli_set_charset($conn, 'utf8mb4');
用 PDO 时,在 DSN 中加上 ;charset=utf8mb4,例如:
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', $user, $pass);
否则 SET NAMES utf8mb4 可能被忽略,尤其在使用持久连接时。
别忘了检查 phpMyAdmin 是否正常显示 emoji——这是最直观的验证方式。如果 phpMyAdmin 页面本身乱码,还要确认其配置文件 config.inc.php 中的 $cfg['DefaultCharset'] = 'utf-8';(注意这里是 UTF-8,不是 utf8mb4)。
真正麻烦的从来不是改配置,而是旧数据迁移和连接层一致性。一个地方漏掉,就可能存进乱码,或者查不出刚插入的内容。










