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