Laravel连接SQL Server失败主因是底层驱动未就绪:Windows需同时启用php_sqlsrv和php_pdo_sqlsrv两个匹配版本的NTS/TD DLL;Linux需确保odbcinst -j有效且列出ODBC Driver 18,缺驱动则报IMSSP错误,证书校验失败则加Encrypt=no;TrustServerCertificate=yes。

不麻烦,但容易卡在驱动和证书环节。
Laravel 本身对 SQL Server 的支持是原生的,sqlsrv 驱动开箱即用——前提是你的 PHP 环境真能“看见”它。绝大多数报错不是 Laravel 写错了,而是底层连不上。
php_sqlsrv 扩展没加载成功是最常见拦路虎
-
php -m | grep sqlsrv返回空?说明扩展根本没进 PHP 运行时 - Windows 下必须同时启用两个扩展:
extension=php_sqlsrv_74_nts.dll和extension=php_pdo_sqlsrv_74_nts.dll(版本号要严格匹配你当前 PHP 版本和 TS/NTS 类型) - Linux 下只启扩展不够,
odbcinst -j要能输出有效路径,且odbcinst -j -d必须列出ODBC Driver 18 for SQL Server - 常见坑:PHP 是 NTS 模式(如 phpstudy/fpm),却启用了
_ts.dll;或者扩展路径写错,php.ini改了但 Apache/Nginx 没 reload
DB_CONNECTION=sqlsrv 配置后连不上,先看错误类型
报
PDOException(code: IMSSP): This extension requires the Microsoft ODBC Driver...
→ 缺 ODBC 驱动,不是 PHP 扩展问题。Windows 装msodbcsql.msi,Linux 走msodbcsql18包安装报
SQLSTATE[08001]: [unixODBC][Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: certificate verify failed
→ SQL Server 用了自签名证书,Linux 下默认校验失败。临时解决加Encrypt=no;TrustServerCertificate=yes;到连接字符串(database.php的'options'数组里)报
Connection refused或超时
→ 检查DB_HOST是否可 ping 通、DB_PORT=1433是否开放、SQL Server 是否启用了 TCP/IP 协议(SSMS → 实例属性 → 连接 → 允许远程连接 + SQL Server 配置管理器中启用 TCP)
config/database.php 里配 sqlsrv 连接要填全关键字段
- 不只是
host、database、username、password -
charset建议显式设为utf8(SQL Server 实际用的是UTF-8编码,但驱动层兼容性依赖此配置) -
prefix如果表名带 schema(如dbo.users),prefix留空更安全,否则 Eloquent 会拼成dbo.dbo.users - 若需指定实例名或命名实例端口,
DB_HOST写成192.168.1.100\SQLEXPRESS或192.168.1.100,1434
真正卡住人的从来不是 Laravel 配置本身,而是 Windows 上 DLL 版本对不上、Linux 上 ODBC 驱动装了但没被 PHP 找到、或者 SQL Server 默认关掉了远程 TCP 连接。验证顺序建议:先用 sqlcmd 或 SSMS 连一次,再看 PHP,最后调 Laravel。


















