PHP字符串限制在odbc_fetch_array上

时间:2013-05-23 03:02:30

标签: php sql sql-server odbc

我有以下sql

SELECT
bw_imp_step as imp_action,   
FROM cm3rm1 m1 INNER JOIN cm3rm2 m2 ON m1.number=m2.number
WHERE m1.number='$id'

当在DbVisualizer中返回相同的查询时,它返回整个字符串,但是在我的php中运行相同的查询会限制字符串并将其剪切到最后。

返回的字符串大约是5500个字符。

以下是运行上述查询的php脚本:

$connection = odbc_connect("Driver={SQL  Server};Provider=SQLNCLI;Server=sname;Database=cbname;","username","password")

$sql = "SELECT
bw_imp_step as imp_action, 
FROM cm3rm1 m1 INNER JOIN cm3rm2 m2 ON m1.number=m2.number
WHERE m1.number='$id'";
$result = odbc_exec ($connection,$sql);

if ($row = odbc_fetch_array($result){
   $imp_action = $row["imp_action"];
}

当我把$ imp_action放到页面甚至文件中时,它会将字符串切断为大约5000个字符。

所以我的问题是:PHP是否限制结果集返回的字符串的大小?我已经读过php可以处理2GB的字符串大小,这个字符串甚至不接近那个大小。

2 个答案:

答案 0 :(得分:1)

您可以通过php.ini这样设置最大文字大小

mssql.textlimit = 2147483647
mssql.textsize = 2147483647

如果您无法访问php.ini,则可以运行此查询。

SET TEXTSIZE 2147483647

另一种选择就是将ini_set与这样的值一起使用

ini_set('mssql.textlimit', '2147483647');
ini_set('mssql.textsize', '2147483647');

如果您要以ini_set方式执行此操作,请确保在建立数据库连接之前完成此操作。

答案 1 :(得分:1)

我知道这是一个老帖子,但我也遇到了这个问题,而且情况非常复杂,需要一个完整的答案。

有几个地方可能会截断您的数据。

ODBC长读取长度

ODBC具有大型列的默认长读取长度(lrl)。通过执行以下操作之一,确保获取的lrl足够大:

  • (Bytes|Time): (\d+|[-+]\d*\.\d+) 中的默认值设置为更大的值,例如php.ini

  • 或者在建立连接之前,使用odbc.defaultlrl = 10000在代码中设置它。

  • 或者在获取结果之前使用ini_set("odbc.defaultlrl", "10000");在代码中设置它。

<强> freetds的

如果您使用FreeTDS从Linux环境连接到MS SQL DB,则odbc_longreadlen($result, "10000");文件中会设置text size限制。仔细检查您的配置是否足够大。

<强> php_mssql

在@ Anujan的回答中,有些人(我认为不是OP)可能正在使用freetds.conf建立联系,在这种情况下,您要确保php_mssql和{{1通过在mssql.textlimit中设置它们或在代码中使用以下内容(在建立连接之前),它们足够大:

mssql.textsize

SQL Server

SQL Server本身设置了一个默认文本大小,您可能需要明确地提高它(特别是如果使用不带php.ini的ODBC以及上面给出的配置)。在这种情况下,请将以下内容添加到查询字符串的开头:

ini_set('mssql.textlimit', "10000");
ini_set('mssql.textsize', "10000");

请注意,某些更改(例如php_mssql)可能需要您重新加载/重新启动PHP / Nginx / Apache才能生效。

您应该能够通过查看截断的结果大小来确定哪些内容会限制您的结果。对我来说,一切都回来了4096个字符长,所以我新的一切都限制了我。

另请注意,上例中的“10000”不是幻数 - 根据您的需要进行调整。