CodeIgniter4 4.2.1版本无法连接SQLServer数据库问题
问题根因
这是CodeIgniter 4 4.2.0版本起对sqlsrv数据库驱动连接逻辑做的不兼容改动导致的,和SQL Server服务端配置、PHP sqlsrv扩展状态无关:
- 4.1.9及更早版本的连接逻辑:如果
hostname字段填写了IP\实例名格式的地址,框架会自动忽略手动配置的port参数,通过SQL Server Browser服务查询对应实例的实际监听端口后再发起连接,因此原有配置可以正常连通。 - 4.2.1版本调整了判断规则:只要配置数组中
port字段存在非空值,无论hostname是否携带实例名后缀,都会强制将该端口追加到连接地址末尾,直接跳过实例端口解析流程。你原有配置中填写的1200端口并不是SQLEXPRESS实例的实际监听端口,请求发送到错误端口自然会被目标计算机拒绝,触发你看到的TCP连接报错。
解决方案
按需选择以下任意一种配置调整方式即可,不需要回退框架版本,也不需要修改SQL Server端配置:
- 方案1(保留实例名连接方式):删除数据库配置中的
port项,或者将port的值设为null/空字符串,框架就会恢复原有逻辑,自动解析实例对应端口发起连接。
调整后的配置参考:public $local = [ 'DSN' => '', 'hostname' => '11.11.22.3\SQLEXPRESS', 'username' => 'ROOT', 'password' => 'EJEMPLO', 'database' => 'EJEMPLO', 'DBDriver' => 'sqlsrv', 'DBPrefix' => '', 'pConnect' => false, 'DBDebug' => (ENVIRONMENT !== 'production'), 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', 'encrypt' => false, 'compress' => false, 'strictOn' => false, 'failover' => [], // 移除port配置,或设置为 'port' => null ]; - 方案2(固定端口直连方式):如果你明确知道目标SQL Server实例实际监听的固定TCP端口,可以把
hostname中的实例名后缀删除,仅保留服务器IP,同时将port项的值改为实例真实监听的端口号,直接通过IP+端口直连,不需要走SQL Server Browser服务解析。
注意事项
配置修改完成后,清空writable/cache目录下的所有缓存文件再测试连接,避免框架读取旧的配置缓存导致问题复现。
内容的提问来源于stack exchange,提问作者Diego Armando Suarez Echanique
相关产品推荐
相关产品推荐

