3

我有以下 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 的字符串大小,而这个字符串甚至不接近那个大小。

4

2 回答 2

5

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

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

ODBC 长读取长度

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

  • 将默认值设置php.ini为更大的值,例如odbc.defaultlrl = 10000.

  • 或者在建立连接之前ini_set("odbc.defaultlrl", "10000");在代码中设置它。

  • 或者odbc_longreadlen($result, "10000");在获取结果之前在代码中设置它。

免费TDS

如果您使用 FreeTDS 从 Linux 环境连接到 MS SQL DB,则文件text size中设置了限制freetds.conf。在这里仔细检查您的配置是否足够大。

php_mssql

正如@Anujan 的回答一样,有些人(我认为不是 OP)可能正在使用php_mssql它们进行连接,在这种情况下,您想确保您的mssql.textlimitmssql.textsize足够大,可以通过将它们设置在您的php.ini或在您的代码(在建立连接之前):

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

SQL 服务器

SQL Server 本身设置了默认文本大小,您可能需要显式增加它(特别是如果使用 ODBC 而没有php_mssql上面给出的配置)。在这种情况下,将以下内容添加到查询字符串的开头:

SET TEXTSIZE 10000
SELECT big_ol_column FROM wherever
...

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

您应该能够通过查看截断的结果大小来确定其中哪些限制了您的结果。对我来说,一切都回来了 4096 个字符长,所以我新的任何限制我的东西都是这样设置的。

另请注意,上例中的“10000”不是一个神奇的数字——根据您的需要调整它。

于 2016-06-27T22:56:35.713 回答
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 方式执行此操作,请确保在建立数据库连接之前完成。

于 2013-05-23T03:11:28.063 回答