Mysql
json 函式:通過變數時添加雙引號
我堅持一個看似簡單的問題,當我使用 MariaDB/MySQL json 函式通過變數創建 JSON 時,它添加了雙引號,這很煩人。但是,如果我不通過變數,它工作正常。不幸的是,當我使用遞歸函式建構 JSON 時,我必須通過變數:
- 沒有變數:
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"}}}
- 有變數
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有兩種,
- JSON 驗證的文本。
- 二進制 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 類型,而且獲得該類型的豐富函式、運算符和索引庫。