Laravel 7.3连接SQL Server 16报错08001的问题求助
Laravel 7.3连接SQL Server 16报错08001的解决问题
问题描述
使用Laravel 7.3连接SQL Server 16数据库时,出现错误:
SQLSTATE = 08001 error- No connection could be made because the target machine actively refused it.
当前.env配置如下:
DB_CONNECTION=sqlsrv DB_HOST=127.0.0.1/instancename DB_PORT=1433 DB_DATABASE=Database DB_USERNAME=sa DB_PASSWORD=12345678
但使用原生PHP脚本可以成功连接:
<?php $serverName = "127.0.0.1/instancename"; $connectionInfo = array( "Database"=>"Database", "UID"=>"sa", "PWD"=>"12345678"); $conn = sqlsrv_connect( $serverName, $connectionInfo); if( $conn ) { echo "Connexion établie.<br />"; }else{ echo "La connexion n'a pu être établie.<br />"; die( print_r( sqlsrv_errors(), true)); } ?>
解决方案
问题出在Laravel处理SQL Server连接配置的逻辑上,当DB_HOST包含实例名时,Laravel的拼接规则会导致连接字符串不符合sqlsrv扩展的要求,以下是两种可行的解决方法:
方法1:拆分主机与实例名配置
- 修改
.env文件,将实例名从DB_HOST中分离,新增DB_INSTANCE项:
DB_CONNECTION=sqlsrv DB_HOST=127.0.0.1 DB_PORT=1433 DB_INSTANCE=instancename DB_DATABASE=Database DB_USERNAME=sa DB_PASSWORD=12345678
- 打开
config/database.php,找到sqlsrv连接配置块,添加instance配置项:
'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'instance' => env('DB_INSTANCE'), // 新增该行 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, ],
方法2:直接使用完整服务器/实例格式并清空端口
SQL Server实例通常使用动态端口,指定固定1433端口会干扰连接。修改.env如下:
DB_CONNECTION=sqlsrv DB_HOST=127.0.0.1\instancename DB_PORT= DB_DATABASE=Database DB_USERNAME=sa DB_PASSWORD=12345678
注意:这里要用反斜杠(\),不是斜杠(/)
验证操作
修改配置后,执行命令清除Laravel的配置缓存:
php artisan config:clear
可以添加测试路由验证连接状态:
// 在routes/web.php中添加 Route::get('/test-db', function() { try { DB::connection()->getPdo(); return "数据库连接成功!"; } catch (\Exception $e) { return "连接失败:" . $e->getMessage(); } });
访问该路由即可确认连接是否恢复正常。
内容的提问来源于stack exchange,提问作者halim
相关产品推荐
相关产品推荐

