php 8.4 连 sql server 2022 失败主因是驱动版本(需 php_pdo_sqlsrv_84_ts_x64.dll)、php.ini 启用方式(extension=pdo_sqlsrv_84_ts_x64,不加.dll)及 dsn 写法(必须含 characterset=utf8 和正确地址如 127.0.0.1,1433)三者未对齐。

php8.4 连不上 SQL Server 2022,不是版本不兼容,而是驱动、配置、网络三处没对齐。微软官方已明确支持 PHP 8.4 + SQL Server 2022(截至 2026 年 7 月),但必须用对驱动版本、启用方式和连接写法。
确认 php_pdo_sqlsrv 或 php_sqlsrv 扩展是否匹配 PHP 8.4
php8.4 默认是线程安全(TS)还是非线程安全(NTS),决定了你要下载哪个 DLL 文件。Apache 用户必须用 TS 版,Nginx + PHP-FPM 用户一般用 NTS 版。
常见错误现象:
- PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_sqlsrv'
- Class 'PDO' not found 或 Call to undefined function sqlsrv_connect()实操建议:
- 运行
php -i | findstr "Thread Safety"(Windows)或php -i | grep "Thread Safety"(Linux/macOS),确认输出是enabled(TS)还是disabled(NTS) - 查
php -v得到确切版本(如PHP 8.4.3) - 到微软官网下载对应 ZIP 包:
php_pdo_sqlsrv_84_ts_x64.dll(TS x64)或php_sqlsrv_84_nts_x64.dll(NTS x64) - 把 DLL 放进
php/ext目录,并确保php.ini中的extension_dir指向该目录(例如extension_dir = "D:/php/ext")
php.ini 必须只启用一个扩展,且文件名完全一致
同时启用sqlsrv 和 pdo_sqlsrv 不会报错,但 PDO 连接时可能静默失败;写错文件名(比如漏掉 _84 或 _ts)会导致扩展加载失败。
实操建议:
- 在
php.ini末尾添加(仅选其一):extension=pdo_sqlsrv_84_ts_x64(若用 PDO)
或extension=sqlsrv_84_ts_x64(若用原生sqlsrv_connect) - 不要加
.dll后缀,Windows 下 PHP 自动补全 - 修改后重启 Web 服务(Apache/Nginx)或 CLI 环境
- 验证是否生效:
php -m | findstr sqlsrv(Windows)应输出pdo_sqlsrv或sqlsrv
PDO 连接字符串必须带 CharacterSet=utf8,否则中文乱码
SQL Server 2022 默认字符集是 Latin1_General_CI_AS,PDO 不显式声明编码时,utf8 字段值会变成问号或乱码,且无警告。
实操建议:
- DSN 中必须包含
CharacterSet=utf8:$dsn = "sqlsrv:Server=localhost;Database=testdb;CharacterSet=utf8"; - 如果用实例名(如
MSSQLSERVER)或远程地址,写成:$dsn = "sqlsrv:Server=192.168.1.100,1433;Database=testdb;CharacterSet=utf8"; - 不要用
localhost——SQL Server 默认不监听127.0.0.1的 TCP/IP,改用(local)、.或 IP+端口 - 密码含特殊字符(如
@、$)时,需 URL 编码,例如sql@2026→sql%402026
SQL Server 2022 必须启用 TCP/IP 协议并开放 1433 端口
即使服务在运行,sqlsrv_connect 或 PDO 仍会超时失败,大概率是 SQL Server 没开 TCP/IP,或 Windows 防火墙拦了端口。
实操建议:
- 打开
SQL Server Configuration Manager→SQL Server Network Configuration→Protocols for MSSQLSERVER→ 右键启用TCP/IP - 双击
TCP/IP→IP Addresses标签页 → 找到IPAll→ 清空TCP Dynamic Ports,填入TCP Port为1433 - 重启
SQL Server (MSSQLSERVER)服务(不是 SQL Server Agent) - Windows 防火墙中新增入站规则:允许端口
1433(TCP) - 用命令行验证连通性:
telnet 127.0.0.1 1433(成功则显示空白,失败则提示无法连接)
最易被忽略的是:SQL Server 2022 默认关闭“SQL Server Browser”服务,而命名实例(如 SQLEXPRESS)必须依赖它解析端口;如果你用的是默认实例,直接走 1433 即可,不用开 Browser 服务。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











