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 = 2147483647
和 mssql.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_mssql
,pdo_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 呢?