0

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

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

SQLSTATE[HY000]:一般错误:10007 Unicode 唯一排序规则中的 Unicode 数据或 ntext 数据无法发送到使用 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 版本 5.2.17。安装了以下 PDO 驱动程序:sqlite、sqlsrv、mssql、mysql、odbc;MSSQL DB-lib 的 PDO 驱动程序:MSSQL_70。XML 来自亚马逊 MWS

4

2 回答 2

0

对于每个偶然发现这个问题的人来说,我发现的解决方法非常简单。PHP.ini 默认将查询的文本字段截断为 4096 字节。

两种补救方法:

  1. 在查询中更新您的文本限制

mssql_query("SET TEXTSIZE 2147483647");

  1. 在 php.ini 中永久更新文本大小(最大大小如下所示)

mssql.textlimit = 2147483647

mssql.textsize = 2147483647

SQL Server PHP 和截断

于 2018-01-26T22:25:40.980 回答
-1

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

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

于 2019-01-23T20:50:15.627 回答