PDO从MS SQL数据库中提取截断的XML

时间:2012-12-06 23:44:34

标签: php xml sql-server-2008 pdo simplexml

我正在尝试编写一个PHP脚本,该脚本将使用PDO检索存储在MS SQL数据库中的XML数据,然后使用SimpleXML解析XML数据。

问题是检索XML数据会导致以下错误消息:

  

SQLSTATE [HY000]:常规错误:10007只能使用Unicode-collat​​ion或ntext数据中的Unicode数据无法使用DB-Library(如ISQL)或ODBC 3.7或更早版本发送到客户端。 [10007](严重程度5)

我正在进行类型转换以检索XML数据,该数据作为文本存储在数据库中。我不一定需要将其作为真正的XML返回。将其作为字符串检索将没有问题,因为我正在使用SimpleXML来解析数据。

但是 - 如果我尝试将此数据作为文本检索,而不进行类型转换,则XML字符串总是被缩短。然后SimpleXML吐出一长串错误,如:

  

标记 ABC 行中的数据提前结束 123

     

预期'>'

返回的XML的字符串长度最大值为4999.如果我输入数据到XML,然后转换为VARCHAR,如下所示:

SELECT CONVERT(VARCHAR(MAX), CAST(XML_DATA AS xml))

然后我可以从字符串中挤出更多的字符 - 最大字符串长度为5085.

施法和转换只是一个疯狂的猜测。它唯一证明的是我不知道这些最大长度来自何处或它们的意思。

如何完整检索XML数据?导致截止的原因是什么? PHP / PDO,还是MS SQL数据库?

有什么建议吗?

其他信息: 数据库是只读的。服务器正在运行PHP V5.2.17。安装了以下PDO驱动程序:sqlite,sqlsrv,mssql,mysql,odbc;用于MSSQL DB-lib的PDO驱动程序:MSSQL_70。 XML来自Amazon MWS

2 个答案:

答案 0 :(得分:0)

对于遇到这个问题的每个人,我发现的修复非常简单。默认情况下,PHP.ini将查询的文本字段截断为4096字节。

两种补救方法:

  1. 在查询中更新文字限制
  2. mssql_query("SET TEXTSIZE 2147483647");

    1. 在php.ini中永久更新文本大小(下面显示的最大大小)
    2. mssql.textlimit = 2147483647

      mssql.textsize = 2147483647

      来源SQL Server PHP and Truncating

答案 1 :(得分:-1)

答案here使用FreeTDS解决方案帮助我解决了unbuntu 16.4,php7.2,MSSQL的相同问题

https://stackoverflow.com/a/38064487/2096951