thinkphp 5.1 默认使用 pdo 作为底层数据库驱动,必须在 database.php 中显式配置 dsn 含 charset=utf8mb4、params 包含 pdo::attr_errmode => pdo::errmode_exception 和 pdo::mysql_attr_init_command => 'set names utf8mb4',且 type 应设为 'pdo_mysql' 或通过完整 dsn 自动识别,否则易导致连接失败、中文乱码或静默错误。

ThinkPHP 5.1 默认使用 PDO 作为底层数据库驱动,但很多项目仍沿用旧版配置习惯,导致连接失败、中文乱码、静默错误或 MySQL 8.0+ 认证方式不兼容等问题——这些问题不是“换个 type 就行”,而是 PDO 初始化阶段的参数错配引发的连锁反应。
确认 PDO 扩展已启用且驱动可用
先验证 PHP 环境是否真正支持 PDO 及对应数据库驱动:
运行 php -r "print_r(PDO::getAvailableDrivers());",输出数组中必须包含 【mysql】 或 【pdo_mysql】(二者选一即可,但不能缺失);
若无 mysql/pdo_mysql,说明 pdo_mysql.so 未加载或 php.ini 中 extension=pdo_mysql.so 被注释;
Windows 用户需同时启用 extension=php_pdo.dll 和 extension=php_pdo_mysql.dll,顺序不可颠倒。
database.php 中 DSN 必须显式带 charset=utf8mb4
TP5.1 不再自动拼接 charset 参数,仅靠 params 里的 SET NAMES 无法覆盖连接初始化时的字符集协商。
在 config/database.php 的 return 数组中,将 'dsn' 配置为完整字符串:'dsn' => 'mysql:host=127.0.0.1;dbname=your_db;charset=utf8mb4;';
【charset=utf8mb4 必须写在 dsn 里,不能只靠 params 设置】;
漏掉这串会导致 emoji 插入截断、JSON 字段解析失败、部分中文显示为问号,且错误不报——查询返回空或字段值被静默丢弃。
params 数组必须显式声明关键 PDO 行为
ThinkPHP 将 params 原样透传给 new PDO() 构造函数,不配就用 PHP 默认行为,极易出问题:
① 加上 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION:否则 SQL 错误(如字段不存在、权限不足)只会返回 false 或空数组,debug 时完全看不出哪里错了;
② 加上 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4':补全连接建立后的字符集声明,与 dsn 中的 charset 形成双重保障;
③ 加上 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC:避免 fetch() 返回数字索引数组,防止字段顺序变动引发逻辑错乱;
④ 开发环境建议设 PDO::ATTR_PERSISTENT => false,否则连接复用可能干扰事务隔离或导致未提交数据残留。
MySQL 驱动类型必须设为 pdo_mysql
方法一:直接改 type 值
将 config/database.php 中的 'type' => 'mysql' 改为 'type' => 'pdo_mysql';
方法二:通过 dsn 指定驱动(更推荐)
删掉 'type' 项,仅保留完整 dsn:'dsn' => 'mysql:host=...',框架会自动识别为 pdo_mysql;
【绝不能写 'type' => 'mysqlnd'】——该驱动名在 PHP 8.2+ 已彻底移除,写上去会导致 Driver [mysqlnd] not supported 报错,且不会提示具体哪错了。
排查遗留 mysql_* 函数调用
PHP 8.2 已完全删除 mysql_connect() 等所有 mysql_* 函数,哪怕只有一处残留,应用启动即 fatal error:
全局搜索命令:grep -r "mysql_" app/ extend/ common/;
重点检查历史插件、自定义数据库封装类、旧版支付 SDK 或手动写的 DAO 层;
发现 mysql_query("SELECT ...") 类调用,一律替换为 \think\Db::query("SELECT ...");
若搜索结果为空,仍需检查 composer require 过的第三方包是否含 mysql_* 调用——某些老版本 think-queue 或 alipay-sdk-php 存在此类问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











