我有以下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的字符串大小,这个字符串甚至不接近那个大小。
答案 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”不是幻数 - 根据您的需要进行调整。