我有json编码的数据,可以采用以下格式: {" forumla":" callTo(\" par1 \",\" par2 \")"} 当我尝试将其插入带有jsonb列的postgresql表时,我收到以下错误:
SQL error QSqlError(-1, "QPSQL: Unable to create query", "ERROR: invalid input syntax for type json
LINE 1: ...15-12-11 15:20:17.350', 21590, '{ "forumla...
^
DETAIL: Token "par1" is invalid.
CONTEXT: JSON data, line 1: ..." : "callTo(\\"par1...
")
似乎Qt以某种方式用转义的反斜杠和引号替换了转义引号(\")。通过psql cli插入字符串有效。 有人可以帮我这个吗?
提前致谢。
更新:
我删除了绑定并用一个替换双反斜杠。
现在我可以成功插入值。
QSqlField f(name, QVariant::String);
f.setValue(fields.value(name));
const QString value = db.driver()->formatValue(f).replace("\\\\", "\\");
问题可能源于Qt(至少在5.x之前)不了解数据库中的json。所以它只能将它视为一个字符串并且看到需要转义反斜杠。
这显然不是一个理想的解决方案。
更新2:
我找到了一个可以接受的解Qt(至少4.7)假定反斜杠是字符串值中的特殊字符。自9.1以来不再是这种情况(默认情况下)。见http://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE
所以我必须设置以下内容,以便Postgresql再次假设\是一个转义反斜杠:
QSqlQuery query(db);
query.exec("SET standard_conforming_strings TO false");
答案 0 :(得分:1)
看来Qt会自动转义字符串中的任何反斜杠\。为什么 - 我不知道。
你可以尝试使用单引号而不是“。可能是Qt只关心转义双引号。所以写一下:
"callTo('par1', 'par2')")
您可以绕过此问题。 (更新:确认这适用于OP,但显然不是理想的解决方案,因为它只是绕过了问题)
另外,Qt可能有一个选项可用于禁用此功能,但我担心我不熟悉它作为一种工具,可以告诉你它是否存在。
希望这有帮助 - 这不是我想给你的答案,但是如果没有更多知识渊博的Qt专家,它可能会给你一些关于尝试的想法!
答案 1 :(得分:0)
我找到了一个可接受的解决方案。 Qt(至少4.7)假定反斜杠是字符串值中的特殊字符。自9.1以来不再是这种情况(默认情况下)。见http://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE 所以我必须设置以下内容,以便Postgresql再次假设\是一个转义反斜杠:
QSqlQuery query(db);
query.exec("SET standard_conforming_strings TO false");