PHP连接SQL Server报“Adaptive Server connection failed”,90%因FreeTDS协议版本(如tds version=7.3)与SQL Server版本不匹配或pdo_dblib未启用,需同步配置freetds.conf、DSN参数及php.ini扩展。

Ubuntu或Debian系统中PHP8安装pdo_dblib扩展后仍无法连接SQL Server,报错SQLSTATE[01002] Adaptive Server connection failed(severity 9),本质是FreeTDS协议版本与目标SQL Server不匹配,需同步调整底层驱动配置与PHP连接参数。
确认FreeTDS是否已安装并定位配置文件
执行dpkg -l | grep freetds检查是否已安装freetds-bin和freetds-dev;若未安装,先运行sudo apt install freetds-bin freetds-dev。
FreeTDS主配置文件通常位于/etc/freetds/freetds.conf;部分源码编译安装路径为/usr/local/freetds/etc/freetds.conf。用ls -l /etc/freetds/freetds.conf确认存在性,不存在则需手动创建。
【必须确保该文件可写,否则后续修改无效】
立即学习“PHP免费学习笔记(深入)”;
设置正确的TDS协议版本
方法一:全局配置(推荐用于固定连接SQL Server 2000/2005/2008)
用sudo nano /etc/freetds/freetds.conf打开配置文件,在末尾新增一个服务器段:
[mssql2008]
host = your-sql-server-ip
port = 1433
tds version = 7.3
注意:SQL Server 2000对应tds version=4.2,2005/2008用7.0或7.3,2012及以上建议8.0;但PHP8+pdo_dblib在多数Linux发行版中实际兼容性最好的是7.3——试过8.0反而握手失败。
方法二:动态指定(适用于多版本SQL Server共存场景)
直接在PHP的DSN中注入协议与编码参数,跳过freetds.conf修改:
$dsn = 'dblib:version=7.3;charset=UTF-8;host=192.168.1.100;dbname=testdb';
这一步能绕过系统级freetds.conf限制,特别适合Docker容器或共享主机环境。
验证pdo_dblib扩展是否启用
第一步:检查PHP是否加载了pdo_dblib模块
运行php -m | grep dblib,有输出即表示已加载;若无输出,说明扩展未启用。
第二步:确认.so文件存在且路径正确
执行php --ini查看配置文件位置,再查扩展目录:php -r "echo ini_get('extension_dir');",进入该目录确认是否存在pdo_dblib.so。
第三步:启用扩展(如未启用)
编辑/etc/php/8.*/cli/php.ini和/etc/php/8.*/apache2/php.ini(按实际PHP版本替换*),在[PHP]节下方添加:extension=pdo_dblib.so。
重启Web服务:sudo systemctl restart apache2 或 sudo systemctl restart php8.*-fpm。
测试连接并捕获真实错误
写一个最小化测试脚本test_mssql.php:
<?php
$dsn = 'dblib:version=7.3;charset=UTF-8;host=192.168.1.100;dbname=testdb';
try {
$pdo = new PDO($dsn, 'sa', 'your_password');
echo "Connected successfully";
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
执行php test_mssql.php;若仍报Adaptive Server connection failed,说明host或端口不通,或SQL Server未开启TCP/IP协议,或防火墙拦截——此时错误根源已不在PHP或FreeTDS层面。
若报Login failed for user,说明认证方式不匹配:SQL Server默认禁用SQL Server身份验证,需在SSMS中右键服务器→属性→安全性→将“服务器身份验证”改为“SQL Server和Windows身份验证模式”,再重启SQL Server服务。



















