簡體   English   中英

用Qt將\\“插入jsonb值

[英]inserting \" into jsonb value with Qt

我有可以采用以下格式的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");

看來Qt會自動轉義字符串中的所有反斜杠\\。 為什么-我不知道。

您可以嘗試使用單引號'代替“。這可能是Qt只關心轉義雙引號。因此,通過編寫:

"callTo('par1', 'par2')")

您可以繞過此問題。 (更新:確認這可以由OP進行,但顯然不是理想的解決方案,因為它只是繞過了問題)

另外,也有可能Qt提供了一個選項,您可以使用它來禁用此功能,但是恐怕我對它作為一種工具不熟悉,無法告訴您它是否存在。

希望有幫助-這不是我想給您的答案,但是在沒有更多知識淵博的Qt專家的情況下,它可能會給您一些有關嘗試的想法!

我找到了可以接受的解決方案。 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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM