Hyperf 3.1 中需在 DSN 中显式声明 charset=utf8mb4,删除 databases.php 中的 charset 配置;MySQL 服务端须配置 character-set-server=utf8mb4 并重启;连接后验证三个 @@characterset* 变量均为 utf8mb4;迁移建表需指定 utf8mb4 字符集与校对规则。

在 Hyperf 3.1 中,要让数据库连接正确使用 utf8mb4,不能只靠 config/autoload/databases.php 里的 'charset' 配置——它在多数情况下会被忽略,尤其是当 DSN 已含字符集声明时。
必须在 DSN 中显式写死 charset=utf8mb4
Hyperf 使用 PDO 连接 MySQL,而 PDO 的行为是:一旦 DSN 字符串里已包含 charset= 子句,'charset' => 'utf8mb4' 这类配置项就完全失效。所以正确做法是:
- 删掉
databases.php中所有'charset' => ...行,避免干扰 - 直接在
'dsn'字段中写死:'dsn' => 'mysql:host=127.0.0.1;dbname=your_db;charset=utf8mb4' - 确保
collation也匹配,例如加&collation=utf8mb4_unicode_ci(部分驱动支持)
同时确保 MySQL 服务端已启用 utf8mb4
即使 PHP 连接设对了,如果 MySQL 服务端默认字符集仍是 latin1 或 utf8,新建表/字段仍会继承错误编码。需确认:
- MySQL 配置文件(
/etc/my.cnf或my.ini)的[mysqld]段有:character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci - 重启 MySQL 服务生效
- 执行
SHOW VARIABLES LIKE 'character_set_server';验证返回值为utf8mb4
验证连接层是否真正生效
启动服务后,在命令行运行:
三个值都必须是 utf8mb4。若其中任一为 utf8 或 latin1,说明连接未生效,优先检查 DSN 是否写对、MySQL 服务端是否重启。
补充:建表迁移也要统一 utf8mb4
Hyperf 的迁移文件中,建议显式指定字符集:
- 创建表时用
$table->engine = 'InnoDB'; $table->charset = 'utf8mb4'; $table->collation = 'utf8mb4_unicode_ci'; - 已有表可通过 SQL 手动升级:
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











