




PHP连接SQL Server必须使用sqlsrv或pdo_sqlsrv扩展,禁用mysql/mysqli;Windows选sqlsrv(函数式API)或pdo_sqlsrv(PDO接口),Linux/macOS仅支持pdo_sqlsrv;需正确配置DSN、认证、加密及UTF-8编码。
mysql 或 mysqli
PHP 原生不支持 SQL Server,mysql_connect() 和 mysqli_connect() 完全无效,强行用会报 Fatal error: Uncaught Error: Call to undefined function mysqli_connect() 或类似连接拒绝错误。必须启用 Microsoft 官方维护的 sqlsrv 或 pdo_sqlsrv 扩展。
这两个扩展不能共存于同一 PHP 实例(尤其 Windows 下),选一个即可;Linux/macOS 必须用 pdo_sqlsrv(通过 ODBC 驱动)。
sqlsrv:仅 Windows,函数式 API(如 sqlsrv_connect()),无需 PDO 层pdo_sqlsrv:Windows/Linux/macOS 均支持,PDO 接口(new PDO()),推荐新项目使用php -m | findstr sqlsrv(Windows)或 php -m | grep sqlsrv(Linux/macOS)sqlsrv 扩展的三步实操以 PHP 8.1 + Apache 为例(其他版本路径微调):
php_sqlsrv_81_ts.dll(TS)或 php_sqlsrv_81_nts.dll(NTS)ext 目录(如 C:\php\ext\),然后在 php.ini 末尾加一行:extension=php_sqlsrv_81_ts.dll
php --ri sqlsrv 看是否显示扩展信息;若报“unable to load dynamic library”,检查 DLL 位数(x64/x86)是否与 PHP 一致pdo_sqlsrv 连接字符串写法和常见认证失败原因连接 SQL Server 不是填个 IP 和端口就行,

SQLSTATE[08001]: [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired 或 Cannot connect: Login failed for user。
$dsn = 'sqlsrv:server=192.168.1.100;Database=testdb;Encrypt=no;TrustServerCertificate=yes;';
$user = 'sa';
$pass = 'your_password';
try {
$pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
echo $e->getMessage();
}
Encrypt=no 是关键:SQL Server 默认要求加密,但本地开发常关掉;生产环境务必设为 yes 并配好证书SQLEXPRESS),写成 server=192.168.1.100\\SQLEXPRESS,注意双反斜杠转义SET NAMES
SQL Server 没有 SET NAMES utf8 这种语法,sqlsrv_query() 或 PDO::query() 执行它会直接报错。乱码根源通常是字段用 varchar 存中文但客户端没声明编码,或数据库排序规则不兼容。
nvarchar(Unicode),而非 varchar;如果已有 varchar 字段,连接 DSN 加 CharacterSet=UTF-8(pdo_sqlsrv 支持,sqlsrv 不支持)_UTF8(如 Chinese_PRC_CI_AS_UTF8),旧规则如 Chinese_PRC_CI_AS 对 UTF-8 字符串支持有限php --ri sqlsrv 和 telnet 192.168.1.100 1433,再写第一行 new PDO()。