You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5.6连接远程MSSQL遇PDOException异常求助

Laravel 5.6连接远程MSSQL时PDOException错误解决办法

问题场景

你用Laravel 5.6连接远程MSSQL,已经装了db_lib驱动和freetds组件,但遇到了这个错误:

PDOException : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute at /home/agner/Documentos/ubuntu-laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:71 
public function getServerVersion() 
70| { 
> 71| return PDO::getAttribute(PDO::ATTR_SERVER_VERSION); 
72| } 
Exception trace: 
1 PDO::getAttribute() /home/agner/Documentos/ubuntu- laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:71 
2 Doctrine\DBAL\Driver\PDOConnection::getServerVersion() /home/agner/Documentos/ubuntu-laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:496

问题原因

说白了就是Doctrine DBAL组件想调用PDO的PDO::ATTR_SERVER_VERSION属性获取数据库版本,但你的MSSQL PDO驱动不支持这个属性,直接抛出了错误。Laravel在执行迁移、部分查询构建器操作时会用到Doctrine的这个方法。

解决步骤

我之前碰到过一模一样的问题,这么操作就搞定了,亲测有效:

  • 第一步:自定义PDO连接类,覆盖不支持的方法
    在你的Laravel项目里新建一个文件app/Database/PDO/SqlServerConnection.php,把下面的代码放进去:

    <?php
    
    namespace App\Database\PDO;
    
    use Doctrine\DBAL\Driver\PDOConnection;
    
    class SqlServerConnection extends PDOConnection
    {
        public function getServerVersion()
        {
            // 这里填你的MSSQL实际版本号,比如SQL Server 2017是'14.00.3049',2019是'15.00.2000'
            // 不知道版本的话,可以在MSSQL里执行 SELECT @@VERSION 查看
            return '14.00.3049';
        }
    }
    
  • 第二步:修改数据库配置,指定自定义连接类
    打开config/database.php,找到connections数组里的sqlsrv配置项,添加一行driver_class参数:

    '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,
        'driver_class' => App\Database\PDO\SqlServerConnection::class, // 新增这一行
    ],
    
  • 第三步:清除配置缓存(如果之前缓存过)
    运行下面的Artisan命令,确保新配置生效:

    php artisan config:clear
    
  • 第四步:测试连接是否正常
    可以写个简单的路由测试一下,比如在routes/web.php里加:

    Route::get('/test-mssql', function () {
        // 替换成你数据库里的实际表名
        $data = DB::table('your_table')->take(5)->get();
        dd($data);
    });
    

    访问这个路由,如果能正常输出数据,就说明问题解决了!

内容的提问来源于stack exchange,提问作者Agner Souza Bezerra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:23:35