我正在使用 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.textlimit
和 mssql.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/