phpenv 默认 mysql 不支持 utf-8 中文需手动配置:修改 my.ini 的 [mysqld] 和 [client] 区块,设 character_set_server、collation_server、init_connect 为 utf8mb4,并启用 skip-character-set-client-handshake;php 连接时须显式指定 utf8mb4;已有库表需用 alter 语句升级编码。

phpEnv 默认 MySQL 配置不支持 UTF-8 中文存储,直接建库/插数据大概率出现 ??? 或 Mojibake(如“æä¸ªæ‡æ¬”),必须手动改配置,且仅改 my.ini 不够,客户端和服务端编码需同步对齐。
确认当前 MySQL 实际字符集
不要只看 phpMyAdmin 界面或 SHOW VARIABLES LIKE 'character%' 的部分结果——它可能显示 utf8,但实际是旧版 utf8(即 utf8mb3),不支持 emoji 和部分生僻中文。必须检查三项:
-
character_set_server:服务器默认字符集(影响新建库) -
collation_server:默认排序规则(应配utf8mb4_unicode_ci) -
init_connect:连接初始化语句,决定新连接的客户端编码
在 phpEnv 自带的 MySQL 命令行或 phpMyAdmin 中执行:
SHOW VARIABLES LIKE 'character\_set\_server';<br>SHOW VARIABLES LIKE 'collation\_server';<br>SHOW VARIABLES LIKE 'init\_connect';
若前两者是 latin1 或 utf8(非 utf8mb4),就必须改配置文件。
修改 phpEnv 的 my.ini 并重启 MySQL
phpEnv 的 MySQL 配置文件路径通常是:D:\phpEnv\MySQL\my.ini(根据你安装路径调整)。关键修改项在 [mysqld] 和 [client] 两个区块:
- 在
[mysqld]下添加或替换:
[mysqld]<br>character_set_server = utf8mb4<br>collation_server = utf8mb4_unicode_ci<br>init_connect = 'SET NAMES utf8mb4'<br>skip-character-set-client-handshake = TRUE
- 在
[client]下添加:
[client]<br>default-character-set = utf8mb4
注意:skip-character-set-client-handshake 是防止客户端(比如 PHP 的 mysqli)传错编码覆盖服务端设置,这个开关很关键,否则改了 init_connect 仍可能失效。
PHP 连接时强制指定 utf8mb4
即使 MySQL 配置正确,PHP 默认连接仍可能用 utf8 协议握手。尤其用 mysqli 或 PDO 时,必须显式声明:
-
mysqli连接后立即执行:$mysqli->set_charset('utf8mb4') -
PDO创建时加 DSN 参数:charset=utf8mb4,例如:mysql:host=127.0.0.1;dbname=test;charset=utf8mb4 - 如果用 PDO 且已启用
PDO::ATTR_EMULATE_PREPARES,建议关掉(设为false),避免预处理语句绕过字符集协商
漏掉这步,INSERT 中文进 utf8mb4 字段仍会变成 ???,因为协议层没升级到 4 字节支持。
已有数据库和表要补救
改完配置并重启 MySQL 后,老库老表不会自动升级编码。必须逐级转换:
- 改库:
ALTER DATABASE `your_db` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 改表:
ALTER TABLE `your_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 改字段(如有特殊需求):
ALTER TABLE `your_table` MODIFY `content` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
特别注意:CONVERT TO 会重建表,大表慎用;且如果字段含 TEXT 或 VARCHAR(255) 且原用 utf8,转 utf8mb4 后实际可存字符数会减少(因单字符最多占 4 字节),必要时需扩大字段长度。
最常被忽略的是 init_connect 和 skip-character-set-client-handshake 的组合效果——它们共同锁定了新连接的起点编码,比 PHP 层设置更前置、更可靠。没配这两项,其他操作都容易半途失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











