MSSQL,PDO,插入 XML 字符串时出错:一般错误:102 '<?xml version="1.0" 附近的语法不正确

Posted

技术标签:

【中文标题】MSSQL,PDO,插入 XML 字符串时出错:一般错误:102 \'<?xml version="1.0" 附近的语法不正确【英文标题】:MSSQL, PDO, error when inserting XML string: General error: 102 Incorrect syntax near '<?xml version="1.0"MSSQL,PDO,插入 XML 字符串时出错:一般错误:102 '<?xml version="1.0" 附近的语法不正确 【发布时间】:2020-04-18 18:15:52 【问题描述】:

我正在尝试将 XML 字符串从 php 插入 MSSQL 数据库。我明白了:

SQLSTATE[HY000]:一般错误:102 ' 附近的语法不正确(后面是一段 xml)。

准备好的语句是:

$stmt = $this->db->prepare('
   INSERT INTO [System_XmlExchangeImport] ([Create_ID], [ImportCode], [InputXml]) 
   VALUES (?, ?, ?);
');
$result = $stmt->execute(array('ABCDEFGHKAJSDKLJ', $code, $xml));

$xml 是一个有效的 XML 字符串。在 SQL 客户端应用程序 (sqlectron) 中使用相同的语句可以正常插入相同的 XML

我不知道下一步该做什么。

【问题讨论】:

阅读有关 $PDO::quote() 或类似内容的信息,以允许您删除 xml 的特殊字符。尝试“回显”您的最终 SQL 查询 另一种选择:使用 simplexml_load_string($yourXMLstring); php.net on PDO::quote 说:“强烈建议您使用 PDO::prepare() 来准备带有绑定参数的 SQL 语句,而不是使用 PDO::quote()”。尝试并使用两者似乎没有意义。另外,使用 simplexml_load_string 是什么意思?我需要插入 XML 字符串。我应该如何处理生成的对象? 是跟随大约 4096 个字节的“xml 块”吗?在 php.ini 中,您可能需要设置 mssql.textlimit = 2147483647mssql.textsize = 2147483647,参考:The problem of truncating text from SQL Server in PHP 此外,如果您要插入具有 xml 数据类型的列,SQL Server 不喜欢被告知编码是(它需要 UTF-16)所以它可能有助于删除 encoding="windows-1250" @RadovanBezak 两个问题:1)您使用什么驱动程序连接到 SQL Server(pdo_mssqlpdo_sqlsrv,...)? 2)System_XmlExchangeImport 表结构是什么?如果可能,请发布实际的XML。谢谢。 【参考方案1】:

问题是由编码引起的。 XML 使用 Windows-1250 编码,但数据库连接使用 UTF-8 字符集打开:

$connString = "dblib:version=7.0;host=$dbIp:$dbPort;dbname=$dbName;charset=UTF-8;";
$this->db = new PDO($connString, $dbUser, $dbPass);

在DSN($connString)中将UTF-8更改为WINDOWS-1250后:

$connString = "dblib:version=7.0;host=$dbIp:$dbPort;dbname=$dbName;charset=WINDOWS-1250;";

可以毫无问题地插入 XML。

【讨论】:

以上是关于MSSQL,PDO,插入 XML 字符串时出错:一般错误:102 '<?xml version="1.0" 附近的语法不正确的主要内容,如果未能解决你的问题,请参考以下文章

PDO + MySQL 总是返回字符串,但是 MsSQL 呢?

无法使用 MSSQL 在 PDO 中引用表名

PDO 通过 MSSQL_* 函数连接到 MSSQL

通过 php 中的 PDO 将 xampp 连接到在线 MSSQL 数据库

通过 PDO ODBC 将 PHP 连接到 MSSQL

PDO从先前选择插入的绑定参数