utf8mb4_unicode_ci是thinkphp项目最稳妥的校对规则,支持中文、emoji及多语言;需在mysql服务层、连接dsn(mysql://...;charset=utf8mb4)、数据库/表结构三处统一配置,并确保init_connect='set names utf8mb4'。

utf8mb4_unicode_ci 是当前 ThinkPHP 项目最稳妥的校对集选择,尤其在涉及中文、emoji、多语言混合场景时。别用 utf8_general_ci,它在 MySQL 5.7+ 已被标记为 deprecated;也别盲目跟风 utf8mb4_0900_as_cs,宝塔面板和部分旧版 PHP 扩展对它的兼容性不稳定。
ThinkPHP 配置里 charset 和 collate 怎么对应填
ThinkPHP 的 database.php 中只暴露 charset 参数,不直接提供 collate 配置项——校对规则由字符集隐式决定,但实际生效依赖底层 MySQL 连接层是否真正协商成功。
-
charset填utf8mb4是硬性前提,utf8不支持 emoji,且无法触发utf8mb4_*系列校对 - 即使配置了
charset => 'utf8mb4',如果 PHP 连接时没执行SET NAMES utf8mb4或等效操作,MySQL 仍按服务器默认(常为latin1)解析字段值 - ThinkPHP 5.x 默认不自动发
SET NAMES,需手动确保连接后调用$pdo->exec("SET NAMES utf8mb4"),或改用 DSN 方式显式声明(见下条)
DSN 连接字符串里怎么强制指定校对规则
DSN 是唯一能绕过框架限制、让校对规则在连接建立瞬间就生效的方式。ThinkPHP 支持字符串形式的 Db::connect(),必须带 ;charset=utf8mb4 后缀,且不能写成 ?charset=utf8mb4 或漏掉分号。
- 正确写法:
mysql://root:123456@127.0.0.1:3306/tpshop;charset=utf8mb4 - 错误写法:
mysql://root:123456@127.0.0.1:3306/tpshop?charset=utf8mb4(PDO 不识别 query string 形式) - 错误写法:
mysql://root:123456@127.0.0.1:3306/tpshop#utf8(旧版写法,仅设字符集,不设校对,且已失效) - 验证是否生效:查
SELECT COLLATION(),返回值应为utf8mb4_unicode_ci或你期望的校对名
为什么改了 database.php 还是乱码
常见原因不是 ThinkPHP 配置错了,而是 MySQL 服务层没同步更新。宝塔面板新建数据库时若未修改全局配置,仍会沿用 latin1 创建库和表,导致 PHP 层再怎么配都白搭。
- 检查 MySQL 全局配置:
/www/server/mysql/etc/my.cnf的[mysqld]段必须包含:character-set-server=utf8mb4collation-server=utf8mb4_unicode_ciinit_connect='SET NAMES utf8mb4'
并确认删掉了skip-character-set-client-handshake - 已有库/表必须手动转换:
ALTER DATABASE `tpshop` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;,再逐表执行ALTER TABLE `user` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 已存乱码数据(如显示为 ????)无法通过 CONVERT 恢复,只能从备份还原
COLLATE 定义三者共同生效的位置。漏掉任意一环,排序、去重、模糊匹配都可能出人意料。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











