PHP 连 TiDB 直接使用 mysqli 或 PDO_MYSQL 即可,无需专用驱动;需确保 TiDB 服务运行、端口开放、权限正确,并在 DSN 中指定 charset=utf8mb4。

PHP 连 TiDB 用的是 MySQL 协议,不是特殊驱动
TiDB 兼容 MySQL 5.7 协议,所以 PHP 不需要装“TiDB 专用驱动”,直接用 mysqli 或 PDO_MYSQL 就行。很多开发者卡在找“tidb-php-driver”,其实根本不存在——TiDB 对接 PHP 的方式和连 MySQL 完全一致。
关键点:确认 TiDB 服务已启动、port 开放(默认 4000)、账号有权限、防火墙/SELinux 没拦住连接。
用 PDO 连 TiDB 最简示例(推荐)
PDO 更易管理连接、支持预处理、兼容性好。注意 DSN 中必须显式指定 charset=utf8mb4,否则中文可能乱码或插入失败。
$dsn = 'mysql:host=127.0.0.1;port=4000;dbname=test;charset=utf8mb4';
$pdo = new PDO($dsn, 'root', '', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);-
host填 TiDB Server 地址(非 PD 或 TiKV) - 别漏写
port=4000,TiDB 默认不用 3306 - 若用 TLS 连接,需加
sslmode=require和证书路径参数 - 连接池类库(如
spiral/database)也适用同一套 DSN 规则
mysqli_connect() 失败常见原因
报错 Connection refused 或 Access denied 是高频问题,多数不是代码问题,而是环境配置没对:
立即学习“PHP免费学习笔记(深入)”;
- TiDB 实例没跑起来:
ps aux | grep tidb-server看进程是否存在 - 连接用了
localhost:它会走 socket 而非 TCP,TiDB 不支持本地 socket,必须用127.0.0.1 - 用户没授权远程访问:
GRANT ALL ON *.* TO 'user'@'%'; FLUSH PRIVILEGES; - PHP 编译时没启用
mysqli扩展:检查php -m | grep mysqli
事务与 autocommit 行为要注意
TiDB 支持快照隔离(SI),但 PHP 默认开启 autocommit,容易误以为“update 没生效”——其实是没 commit。
手动事务要显式控制:
$pdo->beginTransaction();
try {
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollback();
throw $e;
}- TiDB 不支持 savepoint 嵌套回滚(
SAVEPOINT语法虽能解析,但行为不保证) - 长事务(>10 分钟)可能被 TiDB 的
txn-local-latches或 GC 清理掉,PHP 层需做好重试逻辑 -
PDO::ATTR_EMULATE_PREPARES => false必须设为false,否则预处理语句会被 PHP 模拟,丢失 TiDB 的执行计划优化
TiDB 的分布式特性对 PHP 应用层是透明的,但“透明”不等于无感——连接超时、事务重试、字符集、权限模型这些细节,恰恰是上线后最容易出问题的地方。











