必须同时修改服务端、数据库、表、连接四层字符集为utf8mb4,缺一不可;需编辑my.ini配置character_set_server等参数,重启MySQL,并手动执行ALTER DATABASE、ALTER TABLE CONVERT TO及PHP连接层显式指定charset=utf8mb4。

直接改 my.ini 并重启 MySQL 服务即可,但必须同时改服务端、数据库、表、连接四层,漏一层就可能存 emoji 失败或乱码。
确认当前 MySQL 实际字符集配置
别只看 phpMyAdmin 或 SHOW VARIABLES LIKE 'character%' 的返回值——它显示的是服务启动时加载的配置,不一定反映运行时真实生效项。先连上 MySQL 执行:
mysql> SHOW VARIABLES LIKE 'character_set%';<br>mysql> SHOW VARIABLES LIKE 'collation%';
重点关注 character_set_server、character_set_database、collation_server 这三项。如果它们仍是 latin1 或 utf8(注意:MySQL 的 utf8 是阉割版,最多 3 字节),说明配置没生效或被覆盖。
修改 phpEnv 自带的 my.ini 文件
phpEnv 的 MySQL 配置文件通常在:phpEnv\MySQL\my.ini(路径以你实际安装位置为准)。用文本编辑器打开,在 [mysqld] 段落下添加/修改以下几行:
立即学习“PHP免费学习笔记(深入)”;
character_set_server = utf8mb4collation_server = utf8mb4_unicode_ci-
skip-character-set-client-handshake(可选,强制忽略客户端声明的字符集)
⚠️ 注意:init_connect='SET NAMES utf8mb4' 不推荐加——它对 root 用户不生效,且可能在某些权限模式下报错;不如统一靠连接层控制。
已有数据库和表必须手动转换
改完配置并重启 MySQL 后,character_set_server 会生效,但**已存在的数据库、表、列不会自动变更**。需逐级执行:
- 改库:
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; - 改单个字段(如 TEXT 类型):
ALTER TABLE `your_table` MODIFY `content` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
执行前建议备份;CONVERT TO 会重建表,大表慎用。另外,如果字段有索引且是 VARCHAR,长度超过 191 要留意——utf8mb4 下索引前缀限制更严,可能需缩减长度或改用 innodb_large_prefix=ON(phpEnv 默认一般不开)。
PHP 连接层必须显式指定 utf8mb4
即使服务端全设对了,PHP 默认连接仍可能走 utf8。用 mysqli 时,在 new mysqli() 后立刻调用:
$mysqli->set_charset('utf8mb4');
用 PDO 时,DSN 中加 ;charset=utf8mb4,例如:
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', $user, $pass);
别信 SET NAMES utf8mb4 查询——它依赖连接初始化顺序,PDO 构造时没设 charset,后续再执行也晚了。
最易被忽略的是:phpEnv 环境里常混用多个 PHP 版本,每个版本的 php.ini 若启用了 mysql.default_charset,也要同步改成 utf8mb4,否则 mysql_connect()(已废弃但仍有老代码在用)会 fallback 到这个值。



















