CENTOS PHP PDO ODBC MSSQL 2008 r2

CENTOS PHP PDO ODBC MSSQL 2008 r2,php,sql-server,pdo,odbc,centos,Php,Sql Server,Pdo,Odbc,Centos,2天前,SQL管理员将MSSQL从2008升级到2008 R2。 在这次升级之前,我通过FreeTDS使用MSSQL,但升级之后,我无法从存储过程中读取任何输出参数。因此,我从Microsoft Site for Linux安装了官方ODBC驱动程序(我使用的是CentoOS 64) 现在: 我可以连接,进行简单的查询,但我无法捕获存储过程中的任何输出参数,也无法捕获查询输出: select OutputString from tTableOutput where ID = 5 其中,字符串

2天前,SQL管理员将MSSQL从2008升级到2008 R2。 在这次升级之前,我通过FreeTDS使用MSSQL,但升级之后,我无法从存储过程中读取任何输出参数。因此,我从Microsoft Site for Linux安装了官方ODBC驱动程序(我使用的是CentoOS 64) 现在: 我可以连接,进行简单的查询,但我无法捕获存储过程中的任何输出参数,也无法捕获查询输出:

select OutputString from tTableOutput where ID = 5 
其中,字符串包含大型xml

我尝试PDO,ODBC和所有不工作的。 如果我使用PDO:

$result = $db->query("select OutputString from tTableOutput with(nolock) where ID = 5");
foreach ($result as $row) {
    print_r($row);
}
我得到:

PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 4294967293 bytes)
PHP致命错误:未捕获异常“PDOException”并显示消息“SQLSTATE[01004]:字符串数据,右截断:0[Microsoft][ODBC Driver 11 for SQL Server]字符串数据,右截断(SQLFetchScroll[0]at/builddir/build/build/PHP-5.3.3/ext/pdo_ODBC/ODBC stmt.c:528

如何增加长度限制

如果我使用ODBC:

$conn = odbc_connect($dataSource,$user,$password);
$sql = "select OutputString from tTableOutput where ID = 5";

$rs=odbc_exec($conn,$sql);
odbc_binmode ($rs, ODBC_BINMODE_PASSTHRU);
odbc_longreadlen ($rs, 0);

if (!$rs){
    exit("Error in SQL");
}
while (odbc_fetch_row($rs)){
    print_r(odbc_result($rs, "OutputString"));

}
odbc_close($conn);
我得到:

PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 4294967293 bytes)
为什么此查询需要4GB内存


如果有任何帮助,我将不胜感激。

我猜(驱动程序管理器跟踪可能会显示更多)驱动程序将结果列描述为blob/clob/var(max)类型,并且它将返回4Gb或-1的长度。如您所见,如果PHP决定尝试分配那么多,它将失败。我认为这是PHP中的一个缺陷。您可以尝试将XML列转换为文本类型,这可能会使PHP确信它是一种longdata类型,而不是尝试将其保存在一个块中。在Easysoft驱动程序中,我们添加了一个标志来限制长类型的报告大小,以避免出现这种情况,但这对MS驱动程序没有多大帮助。

您可以尝试将值强制转换为varchar(您选择的大小)

i、 e 更改行:

select OutputString from tTableOutput where ID = 5 

这将阻止查询报告4GB大小