通过ODBC / FreeTDS连接到SQL Server 2005和2016时,PHP脚本将文本字段截断为4096个字符

时间:2019-05-01 00:02:02

标签: php sql-server freetds unixodbc

我正在使用FreeTDS / ODBC使用PHP从CentOS7连接到SQLServer2005数据库。除一个字段(一个大的“ note”文本字段已被截断为4096个字符)外,它工作得很好。如何获取我的PHP odbc_exec查询来检索整个文本字段?

我正在将数据库从SQLServer2005迁移到SQLServer2016,但是文本字段截断问题似乎在两者上的行为相同。

我尝试在查询本身中设置textsize:

SET TEXTSIZE 2147483647; SELECT note FROM soap WHERE organizationId=41 and patientId=2019 AND noteId=189

我已经使用odbc / freetds设置在isql中测试了上述连接和查询,并且似乎确实可以正确检索整个文本字段。这是我的freetds.log输出的一部分:

17:30:50.367355 29543 (token.c:1542):tds7_get_data_info:
        colname = note
        type = 35 (text)
        server's type = 35 (text)
        column_varint_size = 4
        column_size = 2147483647 (2147483647 on server)

我尝试在odbc.ini文件中设置文本大小:

[ClaimsServiceNewTest]
Driver                  = /usr/lib64/libtdsodbc.so.0
Description             = Advanced Billing Service Database (TESTING OLD SQL)
Trace                   = Yes
TraceFile               =/tmp/sql.log
ForceTrace              = Yes
SERVERNAME              = ClaimsServiceNewTest
User                    = ********
Password                = ********
Database                = ********
Port                    = 1433
TDS_Version             = 7.1
TextSize                = 2147483647

我还在freetds.conf文件中设置了文本大小:

 # If you get out-of-memory errors, it may mean that your client
        # is trying to allocate a huge buffer for a TEXT field.
        # Try setting 'text size' to a more reasonable limit
        text size = 4294967295 

只有当我尝试在PHP脚本中运行查询时,查询才会被截断。

有什么建议吗?我对所有这些都还很陌生,所以如果我缺少明显的东西,请告诉我。我还注意到isql正在向我的freetds.log文件输出一个TDSDUMP,但是我的PHP查询却不是-我不知道这是否是预期的行为,但是如果您对从PHP查询中输出TDSDUMP有建议,我想它将具有其他有用的信息。

感谢您的考虑!

编辑:Mark Thomas的一个很好的建议是在php.ini中更改mssql.textlimitmssql.textsize。我已经在php.ini文件中进行了更改(并在脚本中使用了ini_set('mssql.textlimit', 10000000);进行了修改,但是我看不到它有所作为(更改php.ini之后重新启动apache应该是足够吧?)

2 个答案:

答案 0 :(得分:1)

由于Mark Thomas' answer,我得以(最终)找到了解决方案。在php.ini中,需要将ODBC对LONG字段的处理从默认的odbc.defaultlrl = 4096更改为更高的值-我使用了odbc.defaultlrl = 2000000

问题解决了!

再次感谢您提供的所有帮助,并向我指出了正确的方向。

答案 1 :(得分:0)

我对PHP有点生疏,但是我认为在连接到某些数据类型(例如您的示例)时,会有一个默认限制。

此上一篇文章对此进行了讨论,并提供了一种解决方案,该解决方案可以通过检查php.ini文件中mssql文本文件大小的默认值来解决:mssql_fetch_object text character limit?