規範如何將 JSON 儲存在表中?
從這個問題,我引用了文件,
“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 AVRO
or之類的語法FORMAT BSON
。使用 時<JSON input clause>
,<value expression>
可以是字元串或二進製字元串。本質上,該規範規定 JSON 值來自字元串或二進制 blob。使它們成為 JSON 的方法是通過一個裝飾器完成的,該裝飾器辨識它及其
FORMAT
s。該規范明確提到了*“實現定義的 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:我不認為實現二進制類型與規範“矛盾”,因為它是明確允許的。我認為正確的詞是“互補”。