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

标签 php sql-server freetds unixodbc

我正在使用 FreeTDS/ODBC 通过 PHP 从 CentOS7 连接到 SQLServer2005 数据库。它运行良好,但有一个字段除外——一个大的“注释”文本字段被截断为 4096 个字符。如何让 PHP odbc_exec 查询检索整个文本字段?

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

我尝试在查询本身中设置文本大小:

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 正在将 TDSDUMP 输出到我的 freetds.log 文件,但我的 PHP 查询不是 - 我不知道这是否是预期的行为,但如果您对从我的 PHP 查询输出 TDSDUMP 有建议,我想它会有额外的有用信息。

感谢您的考虑!

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

最佳答案

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

问题解决了!

再次感谢您的所有帮助并为我指明了正确的方向。

关于通过 ODBC/FreeTDS 连接到 SQL Server 2005 和 2016 时,PHP 脚本将文本字段截断为 4096 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55930108/

相关文章:

php - Solr 按字段值提升结果

c# - 如何检查 SQL Server 表中是否存在一行?

sql - 差异备份大小太大

iphone - 将 FreeTDS 交叉编译到 iPhone

sql-server - OS Capitan freetds.conf 目录问题

php - Jquery ajax返回当前页面的html作为响应

php - PDO mySQL 中的命名占位符导致服务器错误

javascript - Symfony2 需要一些关于购物车的清晰度和指导(关于数量)

c# - 对 SQL Server 2008 全文搜索的担忧

php - 使用 mssql 方法(Mac OS X 上的 FreeTDS、PHP 和 Apache)