我正在使用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.textlimit
和mssql.textsize
。我已经在php.ini文件中进行了更改(并在脚本中使用了ini_set('mssql.textlimit', 10000000);
进行了修改,但是我看不到它有所作为(更改php.ini之后重新启动apache应该是足够吧?)
答案 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?