Mysql

規範如何將 JSON 儲存在表中?

  • January 5, 2018

從這個問題,我引用了文件

“MariaDB 將其實現為 LONGTEXT,因為 JSON 數據類型與SQL 標準相矛盾,而且 MariaDB 的基準表明性能至少是相當的。”*

這引發了評論

我不得不穀歌,看起來 MariaDB 現在支持 CHECK 約束。當他們說 JSON 與 SQL 標準相矛盾時,不確定他們的意思是什麼?——昨天的倫納特

我也想知道他們的意思。那麼當說“與標準相矛盾”時,MariaDB 是什麼意思。

SQL:2016

這是我自己閱讀的ISO/IEC TR 19075-6:2017: SQL support for JavaScript Object Notation (JSON)

忽略 (a) MySQL 在規範方面的跟踪記錄,以及 (b) 他們現在正在實現 JSON 類型的事實。好像他們指的是這個,

A<JSON value expression>可能有一個可選的<JSON input clause>. 這表明值表達式應該被解析為JSON. 標準化選項是FORMAT JSON; 實現也可能支持諸如FORMAT AVROor之類的語法FORMAT BSON。使用 時<JSON input clause><value expression>可以是字元串或二進製字元串。

本質上,該規範規定 JSON 值來自字元串或二進制 blob。使它們成為 JSON 的方法是通過一個裝飾器完成的,該裝飾器辨識它及其FORMATs。該規范明確提到了*“實現定義的 JSON 表示選項”*,它以 BSON 和 Apache AVRO 作為範例。它看起來像這樣(我對規範的閱讀)

SELECT str FORMAT JSON BSON;

從那裡可以使用“SQL/JSON 數據模型”訪問值構造,並且規範的其餘部分適用於它。但是沒有二進制儲存機制,也沒有規定必須為 SQL/JSON 實現。實施一個似乎與規範並不矛盾。事實上,它繼續說,

建構子使用 SQL 類型的值並生成以 SQL 字元或二進製字元串類型表示的 JSON 值(JSON 對像或 JSON 數組)。

所以它們可以表示為二進制類型,

查詢函式根據 JSON 值評估 SQL/JSON 路徑語言表達式,生成 SQL/JSON 類型的值,這些值被轉換為 SQL 類型。

並且 SQL 查詢需要返回“SQL 類型”,無論底層是否存在命名二進制類型。大多數數據庫都會這樣做,儘管它們返回 JSON 的字元/varchar/文本表示。

規範中將 JSON 儲存在表中的唯一範例使用字元串,

CREATE TABLE employees (
emp_id INTEGER,
name CHARACTER VARYING(50),
salary DECIMAL(7,2),
dept_id INTEGER,
json_emp CHARACTER VARYING(5000) )

這本質上意味著它是根據RFC7159序列化和解析的。json_emp規範中缺少對的檢索也有點有趣。

**tldr:我不認為實現二進制類型與規範“矛盾”,因為它是明確允許的。我認為正確的詞是“互補”。

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