Windows环境下Laravel迁移连接sqlsrv数据库提示找不到驱动
我之前也碰到过一模一样的情况:Web端能正常连SQL Server查数据,但一跑php artisan migrate就报驱动找不到。核心问题基本都是CLI环境的PHP配置和Web环境不匹配——毕竟浏览器用的PHP和终端里执行php artisan的PHP,可能根本不是同一个,或者CLI的PHP没启用sqlsrv驱动。下面是一步步排查解决的方法:
第一步:确认CLI用的PHP版本和配置文件
先在终端里跑这两个命令,搞清楚当前CLI环境的PHP信息:
php -v php --ini
把输出的PHP版本和你Web环境的PHP版本(可以写个phpinfo.php查看)对比,如果版本不一样,那肯定是CLI的PHP没装sqlsrv驱动;如果版本一致,就看php --ini里的Loaded Configuration File路径,这是CLI真正在用的php.ini文件。
第二步:检查CLI的php.ini是否启用了驱动
打开刚才找到的CLI版php.ini,搜索以下两行,确保前面没有分号(;)注释:
extension=sqlsrv extension=pdo_sqlsrv
如果有分号就去掉,保存后重启终端(Linux/macOS)或者重启PHP服务(Windows比如IIS、PHP-FPM)。
第三步:验证CLI的PHP是否加载了驱动
在终端里运行这个命令,查看已加载的扩展列表:
php -m
看看输出里有没有sqlsrv和pdo_sqlsrv这两项。如果没有,大概率是你装的驱动版本和CLI的PHP版本不兼容——比如你给PHP8.1装了驱动,但CLI用的是PHP7.4,这种情况就得重新下载对应版本的驱动安装。
第四步:清理Laravel配置缓存并核对配置
有时候Laravel会缓存旧的配置,先清一下:
php artisan config:clear
然后打开config/database.php,检查sqlsrv的配置块是否和你的.env对应:
'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, ],
另外你提供的.env里没写全DB_USERNAME和DB_PASSWORD,一定要确保这两项配置正确哦。
第五步:用CLI脚本测试SQL Server连接
写个简单的测试脚本test-sqlsrv.php,用终端运行验证连接:
<?php try { $conn = new PDO("sqlsrv:Server=你的DB_HOST,1433;Database=你的DB_DATABASE", "你的DB_USERNAME", "你的DB_PASSWORD"); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Connected successfully"; } catch(PDOException $e) { echo "Connection failed: " . $e->getMessage(); } ?>
运行命令:
php test-sqlsrv.php
如果能输出Connected successfully,说明CLI环境的驱动没问题,再跑php artisan migrate应该就正常了。
内容的提问来源于stack exchange,提问作者Lim Socheat

