Mysql

json 函式:通過變數時添加雙引號

  • January 3, 2018

我堅持一個看似簡單的問題,當我使用 MariaDB/MySQL json 函式通過變數創建 JSON 時,它添加了雙引號,這很煩人。但是,如果我不通過變數,它工作正常。不幸的是,當我使用遞歸函式建構 JSON 時,我必須通過變數:

  1. 沒有變數:
declare temp_json JSON;
set temp_json = json_object('data',json_object("jsonapi",json_object("version", "1.0")));
select temp_json

輸出

{"data": {"jsonapi": {"version": "1.0"}}}
  1. 有變數
declare temp_json JSON;
declare jsonapiheader JSON;
set jsonapiheader = json_object("jsonapi",json_object("version", "1.0"));
set temp_json = json_object('data',jsonapiheader);
select temp_json

輸出

{"data": "{\"jsonapi\": {\"version\": \"1.0\"}}"}` 

那麼我該怎麼做 2) 但輸出為 1) ?

我的系統:MariaDB 10.2.9

首先,一般來說JSON有兩種,

  1. JSON 驗證的文本。
  2. 二進制 JSON(Mongo 將其稱為 BSON,PostgreSQL 將其稱為 JSONB,也稱為 Apache Avro)。

作為參考,MariaDB 兩者都沒有。它有一個 JSON 類型,但該類型只不過是來自文件的未經驗證的文本

JSON 是為與 MySQL 的 JSON 數據類型兼容而引入的 LONGTEXT 的別名。MariaDB 將其實現為 LONGTEXT,因為 JSON 數據類型與 SQL 標準相矛盾,而 MariaDB 的基準測試表明性能至少是相當的。

如果需要經過驗證的列,則需要使用 CHECK 約束。所以本質上,在內部,所有“做 JSON”的函式,本質上是在內部讀取文本並處理它並輸出文本。

因此,您遇到的問題是json_object不知道該值JSON 文本。這不是一件容易的事。從 MariaDB 的角度來看,唯一的選擇是將每個函式實現為接受一個值,另一個實現為接受 jdoc,或者正確執行並為 JSON 實現一個真實類型。

作為旁注,有一個函式確實接受兩個 jdocs,一個用於操作,一個作為參數。那個函式是JSON_MERGE

也可以看看,

如果還不算太晚,我強烈建議遷移到 PostgreSQL。您不僅獲得二進制 JSON 類型,而且獲得該類型的豐富函式、運算符和索引庫。

引用自:https://dba.stackexchange.com/questions/192754