You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux环境下PHP ODBC+FreeTDS连接MS SQL数据库报错排查

问题:Linux环境下PHP PDO+ODBC+FreeTDS连接MS SQL服务器报错

报错信息:

SQLSTATE[08S01] SQLDriverConnect: 20009 [unixODBC][FreeTDS][SQL Server]Unable to connect: Adaptive Server is unavailable or does not exist

使用的PHP代码:

try {
    $DSN = 'odbc:Driver={FreeTDS};
        Server=example.testtelecom.cloud\MGNA,1434;Database=Referrals;
        Trusted_Connection=yes';

    $dbconn = new PDO($DSN, $username, $pwd);
    
    $dbconn -> setattribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    $dbconn -> setattribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}catch (PDOException $e) {
    echo "Broke: ". $e->getMessage();
}

主机已预装的相关驱动(通过phpinfo确认):

  • PDO Driver for FreeTDS/Sybase DB-lib
  • PDO Driver for ODBC (unixODBC)
  • PDO drivers: dblib, firebird, mysql, odbc, pgsql, sqlite

排查与修复步骤

1. 修正DSN的服务器地址格式

FreeTDS不支持服务器\实例,端口的写法,需要拆分端口为独立参数,同时避免DSN内换行可能导致的解析问题。修改后的DSN示例:

$DSN = 'odbc:Driver={FreeTDS};Server=example.testtelecom.cloud\MGNA;Port=1434;Database=Referrals;Trusted_Connection=yes';

2. 验证FreeTDS配置文件(可选但更稳定)

编辑/etc/freetds.conf添加实例配置,指定TDS版本(需匹配你的MS SQL版本,如SQL Server 2016+用7.4):

[MGNA]
host = example.testtelecom.cloud
port = 1434
tds version = 7.4
database = Referrals

之后DSN可简化为:

$DSN = 'odbc:Driver={FreeTDS};Server=MGNA;Trusted_Connection=yes';

3. 测试网络连通性

在Linux主机上执行以下命令,确认目标端口可访问:

nc -zv example.testtelecom.cloud 1434
# 或用telnet
telnet example.testtelecom.cloud 1434

如果连接失败,说明是网络防火墙限制或服务器地址/端口错误,需联系服务商确认。

4. 检查Windows身份验证的可行性

Trusted_Connection=yes依赖Kerberos配置,Linux环境未配置Kerberos时,需改用SQL Server身份验证,移除该参数并确保传入的$username和$pwd是SQL Server合法账号:

$DSN = 'odbc:Driver={FreeTDS};Server=example.testtelecom.cloud\MGNA;Port=1434;Database=Referrals';
$dbconn = new PDO($DSN, $username, $pwd);

5. 用FreeTDS自带工具排查基础连接

使用tsql命令直接测试连接,排除PHP层面问题:

tsql -S example.testtelecom.cloud\MGNA -U $username -P $pwd -p 1434

若该命令能成功连接,说明问题出在PHP DSN写法;若失败,根据tsql报错信息定位FreeTDS或网络问题。

6. 简化PDO错误模式设置

代码中两次设置错误模式,后一次会覆盖前一次,可简化为:

$dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

内容的提问来源于stack exchange,提问作者P Heron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:25:38