Ubuntu20.04下PHP7.4 PDO连接SQLServer2005报01002错误如何解决
PDO dblib连接SQL Server 2005报01002错误排查方案
报错SQLSTATE[01002] Adaptive Server connection failed属于通用连接层错误,按以下顺序逐层排查:
1. 基础网络连通性校验
首先排除网络层拦截问题,在Ubuntu 20.04服务器上执行端口探测命令:
nc -zv 10.10.10.10 1433
- 如果返回连接超时/拒绝,优先排查三点:
- 数据库服务器本地防火墙、网络安全组是否放通1433端口,且允许当前Ubuntu服务器的IP访问
- 登录SQL Server 2005服务器,打开SQL Server配置管理器,确认TCP/IP协议已启用——SQL Server 2005默认安装时TCP/IP是禁用状态,仅支持命名管道连接,启用后需要重启SQL Server服务生效
- 如果是命名实例,不要默认用1433端口,在SQL Server配置管理器的TCP/IP属性里查看实例实际监听的动态端口,替换连接串里的端口值
- 如果nc返回端口连通正常,继续排查驱动配置问题。
2. 修正freetds驱动的TDS协议版本
Ubuntu下PHP的dblib扩展依赖freetds驱动连接SQL Server,默认配置的TDS协议版本过高,无法兼容SQL Server 2005:
- 执行命令查看freetds配置文件路径:
php -i | grep freetds
通常配置文件路径为/etc/freetds/freetds.conf
2. 编辑配置文件,找到[global]配置段,修改TDS版本为适配SQL Server 2005的7.0版本:
[global] tds version = 7.0 text size = 64512
TDS 7.2及以上版本仅适配SQL Server 2008及更新版本,版本不匹配会直接握手失败,报当前的连接错误
3. 保存配置后直接重跑PHP脚本即可,不需要重启PHP或freetds服务。
3. 调整PDO连接参数兼容老版本数据库
如果改完全局配置还是报错,在PDO连接串里显式指定TDS版本、关闭不兼容的加密配置,修改连接代码如下:
<?php function pdoOnLine() { global $pdo; $pdo = new PDO('dblib:host=10.10.10.10:1433;dbname=test;charset=utf8;tds_version=7.0', 'test', 'test', [ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]); } try { pdoOnLine(); } catch (\PDOException $e) { // 调试阶段直接打印完整错误上下文,方便定位具体问题 var_dump($e->getMessage(), $e->getCode()); exit; } ?>
4. 账号与数据库配置校验
网络、驱动配置都正常的情况下,检查数据库侧配置:
- 确认SQL Server 2005开启了混合身份认证模式,默认安装时仅开启Windows身份认证,SQL账号无法登录
- 确认test账号密码正确,未被锁定,且拥有test库的对应访问权限
- 检查SQL Server 2005是否开启了强制连接加密,老版本freetds不支持高版本TLS协议,会直接握手失败,关闭强制加密即可正常连接。
内容的提问来源于stack exchange,提问作者Mario Rovelli
相关产品推荐
相关产品推荐

