thinkphp数据库乱码主因是误用mysql伪utf-8(utf8仅支持3字节),必须五层统一utf8mb4:dsn显式声明charset=utf8mb4、配置项设utf8mb4、mysql服务端character_set_server=utf8mb4、表与字段convert to utf8mb4、php文件保存为utf-8 without bom。

ThinkPHP 数据库乱码,90% 是因为把 utf8 当成了完整 UTF-8 —— 它其实是 MySQL 的三字节伪编码,不支持 emoji 和大部分扩展汉字;必须用 utf8mb4,且不能只改一处,得五层对齐。
为什么 charset => 'utf8' 一定不行
MySQL 的 utf8 是历史包袱:它最多只支持 3 字节字符(U+0000–U+FFFF),而 emoji、生僻字、部分数学符号、少数民族文字都在 4 字节区(U+10000 起)。你写 'charset' => 'utf8',PDO 就按 utf8mb3 协商,连上就丢数据,不是报错,是静默截断或变 ????。
- TP6/TP8 配置里出现
'charset' => 'utf8',必须立刻改成'charset' => 'utf8mb4' - TP5 不识别
charset键,光改这个没用,得往params里塞PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4" - TP8 更激进:仅配
charset键已不够,DSN 字符串里必须显式带charset=utf8mb4,例如:'dsn' => 'mysql:host=127.0.0.1;dbname=test;charset=utf8mb4;'
排序规则选 utf8mb4_unicode_ci 还是 utf8mb4_general_ci
排序规则(collation)不决定能不能存 emoji,但决定中文、英文、重音字符怎么比大小、是否区分大小写。选错会导致 WHERE name = '张三' 查不到、ORDER BY 排序错乱、唯一索引误判重复。
-
utf8mb4_unicode_ci基于 Unicode 标准排序,多语言兼容性好,中文排序更合理,推荐作为默认 -
utf8mb4_general_ci是旧版简化规则,速度略快但准确性差,比如把é和e当成一样,TP8 新建表默认已弃用它 -
utf8mb4_bin是二进制比较,严格区分大小写和全角半角,适合密码字段或 token 存储,别乱用在用户昵称上 - 建库/建表时务必显式声明,别依赖 MySQL 服务端默认值——云厂商或 Docker 镜像的
character_set_server可能还是utf8
表结构和字段编码必须手动升级,TP 不会自动继承
即使数据库连接设对了 utf8mb4,老表还是 utf8 或 latin1 编码,新增字段照样继承旧字符集,emoji 插进去就是 ???。TP 的迁移命令(如 Schema::create)不会自动加 CHARACTER SET utf8mb4,得自己补。
- 查真实字段编码:
SHOW CREATE TABLE `user`;,看每列定义末尾有没有CHARACTER SET utf8mb4 - 整表升级(安全):
ALTER TABLE `user` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 单字段补救(TP8 可用):
DB::statement("ALTER TABLE `user` MODIFY `content` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); - 新建表时显式指定:
$table->string('title')->charset('utf8mb4')->collation('utf8mb4_unicode_ci');
最容易被忽略的两个点:BOM 和连接后验证
配置全对了,页面开头空白、JSON 解析失败、POST 中文变乱码?八成是 PHP 文件带 BOM,或者你以为连上了 utf8mb4,其实 MySQL 暗地里给你切回了 latin1。
- 所有
.php和模板文件必须保存为UTF-8 without BOM;用file -i xxx.php检查,显示charset=utf-8-bom就要重存 - 连接建立后立刻验证:
DB::select("SHOW VARIABLES LIKE 'character_set_client';");,结果必须是utf8mb4,不是utf8也不是空 - 如果返回
utf8,说明 DSN 没生效、params冲突、或 MySQL 服务端缺utf8mb4字符集文件(常见于精简 Docker 镜像)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











