MYSQL JSON データ操作

推奨ドキュメント:  mysql公式サイト -- JSON関数

Mysql は 5.7 から json データ型を導入しており、バイナリ文字を格納する blob やテキスト型データを格納する text と比較して、json に格納されたデータは json 形式に準拠しているかどうかを検証します。また、json が格納できる最大テキスト長は、longBlob および longText のテキスト長と同じです。

データの種類 収納長さ
タイニーブロブ、タイニーテキスト

 L+ 1 バイト、ここで L<2^{8}

BLOB、テキスト

 L+ 2 バイト、ここで L2^{16}

ミディアムブロブ、ミディアムテキスト

 L+ 3 バイト、ここで L2^{24}

LONGBLOB、LONGTEXT、JSON

 L+ 3 バイト、ここで L2^{32}

mysqlのJSON処理関数: 

関数 説明する
-> パスを評価した後、JSON 列から値を返します (JSON_EXTRACT() と同等)。
->> パスを評価し、結果を逆参照した後、JSON 列から値を返します。JSON_UNQUOTE(JSON_EXTRACT()) と同等です。
JSON_ARRAY() JSON配列の作成
JSON_ARRAY_APPEND() JSONドキュメントにデータを追加する
JSON_ARRAY_INSERT() JSON配列を挿入
JSON_CONTAINS() JSON ドキュメントのパスに特定のオブジェクトが含まれているかどうか
JSON_CONTAINS_PATH() JSON ドキュメントのパスにデータが含まれていますか
JSON_DEPTH() JSON ドキュメントの最大深さ
JSON_EXTRACT() JSON ドキュメントからデータを返す
JSON_INSERT() JSON ドキュメントにデータを挿入する
JSON_KEYS() JSON ドキュメントからのキーの配列
JSON_LENGTH() JSONドキュメント内の要素の数
JSON_MERGE() 重複キーを保持しながら、JSON ドキュメントをマージします。非推奨の JSON_MERGE_PRESERVE() 同義語 (非推奨)
JSON_MERGE_PATCH() JSON ドキュメントをマージし、重複キーの値を置き換えます
JSON_MERGE_PRESERVE() 重複キーを保持して JSON ドキュメントをマージします
JSON_OBJECT() JSONオブジェクトの作成
JSON_OVERLAPS() (バージョン 8.0.17) 2 つの JSON ドキュメントを比較し、共通のキーと値のペアまたは配列要素がある場合は TRUE (1) を返し、そうでない場合は FALSE (0) を返します。
JSON_PRETTY() JSON ドキュメントを人間が読める形式で印刷する
JSON_QUOTE() JSONドキュメントの引用
JSON_REMOVE() JSONドキュメントからデータを削除する
JSON_REPLACE() JSONドキュメント内の値を置換する
JSON_SCHEMA_VALID() (バージョン 8.0.17) JSON ドキュメントを JSON スキーマに対して検証します。ドキュメントがスキーマに対して検証された場合は 1 を返し、それ以外の場合は 0 を返します。
JSON_SCHEMA_VALIDATION_REPORT() (バージョン 8.0.17) JSON スキーマに対して JSON ドキュメントを検証し、成功または失敗と失敗の理由を含む検証結果に関するレポートを JSON 形式で返します。
JSON_SEARCH() JSON ドキュメントの値のパス
JSON_SET() JSON ドキュメントにデータを挿入する
JSON_STORAGE_FREE() 部分的な更新後に JSON 列値のバイナリ表現で解放されたスペース
JSON_STORAGE_SIZE() JSONドキュメントのバイナリ表現を保存するためのスペース
JSON_TABLE() JSON 式のデータをリレーショナル テーブルとして返します。
JSON_TYPE() JSON値の種類
JSON_UNQUOTE() JSON値を逆参照する
JSON_VALID() JSON値は有効ですか
JSON_VALUE() (バージョン 8.0.21) 指定されたパスが指す場所にある JSON ドキュメントから値を抽出し、この値を VARCHAR(512) または指定された型として返します。
()のメンバー (バージョン 8.0.17) 最初のオペランドが 2 番目のオペランドとして渡された JSON 配列の要素と一致する場合は 1 を返し、それ以外の場合は 0 を返します。

よく使用される関数が紹介されています。 

テーブルを作成してデータを挿入します。 

CREATE TABLE `zsm_json` (
  `json_test` json DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

INSERT INTO `zsm_json`(`json_test`) VALUES ('[1,2,3,4]');
INSERT INTO `zsm_json`(`json_test`) VALUES ('{\"a\": 1, \"b\": 2, \"c\": [3, 4, 5]}');

实际应用中最常用的是前两个函数, 从json文本中获取制定值

1、 ->  、 ->>  获取json元素

1.1、 基础操作, 获取json元素: jsonColumn -> '$.keyName' 

select json_test -> '$.a' from zsm_json
select json_test -> '$."a"' from zsm_json  // a带双引号

select json_test -> '$[0]' from zsm_json   // 取第一个值
select json_test -> '$[1]' from zsm_json   // 取第二个值

result1: 

result2:

result3:

result4: 

 从上面的结果可以得出结论: 

  1.  json列既可以存储json对象也可以存储json数组
  2.  获取json中特定key的值,可以使用 $.keyName ,  keyName加不加双引号都行
  3. 如果json列中存储的是JSON数组, 可以使用$[index] 获取特定索引下的值, 而json对象被认为是只有一个元素的数组

1.2、json对象中存在数组元素或数组元素中存在json对象, 获取下层元素

// 获取JSON对象中key为 ‘c’的JSON数组中下标为2的元素
select json_test -> '$.c[2]' from zsm_json;

select json_test -> '$[0].c[2]' from zsm_json;

两个的查询结果都一样: 

1.3   ->>  处理特殊字符 

先往数据库中插入一条数据

INSERT INTO `zsm_json`(`json_test`) VALUES ('{"mascot": "Our mascot is a dolphin named \\"Sakila\\"."}');

查询:

select json_test -> '$.mascot' from zsm_json;

select json_test ->> '$.mascot' from zsm_json;

result1:

result2:

 可以看到使用 -> 查询到的数据, 对于转义字符 \" 并没有进行转义; 而使用 ->>  查询的结果, 转义字符被转成正常的字符。

-> 的使用不限于select, 也可以用于where 、 update等操作中

2、JSON_EXTRACT 获取json数据

json_extract 的功能与 -> 相似,从json文本中获取数据。 他的语法格式: 

JSON_EXTRACT(json_doc, path[, path] ...)

他可以一次获取多个value值, 并存放到一个数组中

SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]');

SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]');

具体的执行结果,这里就不再展示了。

3、其它搜索json值函数

  1. JSON_CONTAINS(target, candidate[, path]) : 判断candidate文档中是否包含target文档, 如果制定了path参数,则在 candidate 的 path 路径中寻找 target。 这里path不能使用通配符。
  2. JSON_CONTAINS_PATH(json_doc, one / all, path[, path] ...) : 判断json文档中是否包含制定路径。
    1. 'one': 如果文档中至少存在一个路径,则为 1,否则为 0。

    2. 'all': 如果文档中存在所有路径,则为 1,否则为 0。

  3. JSON_KEYS(json_doc[, path]) : 返回json文档中的所有一级key, 如果path指定, 返回指定路径下的一级key

  4. JSON_OVERLAPS(json_doc1, json_doc2) : 比较两个 JSON 文档是否具有任何共同的键值对或数组元素。

  5.  value MEMBER OF(json_array) : json数组中是否包含value值

  6. JSON_SEARCH(json_doc, one / all, search_str[, escape_char[, path] ...]) : 返回json文档中给定字符串的路径。

    1. 'one':搜索在第一次匹配后终止并返回一个路径字符串。未定义首先考虑哪个匹配。当我们要匹配的值有多个, 返回第一个匹配到的value的key。

    2. 'all':搜索返回所有匹配的路径字符串,这样就不会包含重复的路径。如果有多个字符串,它们会自动包装为一个数组。数组元素的顺序未定义。

    3. // 下面是mysql官方文档给出的示例语句
      SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
      
      SELECT JSON_SEARCH(@j, 'one', 'abc');
      
      SELECT JSON_SEARCH(@j, 'all', 'abc');
      
      SELECT JSON_SEARCH(@j, 'all', 'ghi');

  7. JSON_VALUE(json_doc, path) : 从json文档中获取指定路径下的值。完整的语法格式如下:

    JSON_VALUE(json_doc, path [RETURNING type] [on_empty] [on_error])
    
    -- RETURNING  type 用于制定返回值类型, 
        -- type 取值 : float/double/decimal/signed/unsigned/date/char/json.... 如果不指定, 默认为 varchar(512)
    
    -- on_empty 未找到数据时,操作行为: 
        -- NULL ON EMPTY : 默认行为
        -- DEFAULT 'value' ON EMPTY : 返回value, 注意类型匹配
        -- ERROR ON EMPTY : 抛出错误
    -- on_error 发生错误时, 操作行为
        -- NULL ON ERROR: 返回null, 默认行为
        -- DEFAULT 'value' ON ERROR : 返回value, 注意类型匹配
        -- ERROR ON ERROR : 抛出错误

4、修改JSON值得函数

  1.  JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...) : 将值添加到json文档中指定数组的末尾并返回结果。
  2. JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...) : 在JSON文档的指定位置插入指定值。
  3. JSON_INSERT(json_doc, path, val[, path, val] ...) :  在json文档的指定路径上插入值,并返回整个json串
  4. JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...): 合并多个json对象( json对象不是json数组)。 当多个json文档中存在相同的key时, 后面的key值会覆盖前面的json中的key值。
    1. 如果第一个参数不是json对象, 则会返回第二个参数, 无论第二个参数是否是json文档。
    2. 如果第二个参数不是json对象, 第一个参数是json对象, 返回第一个json对象
  5. JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...) : 合并多个json对象, 不同的是它不会将值覆盖。 
    1. 可以合并json数组
    2. 如果多个json对象中有相同的key, 这里不是覆盖,而是合并多个json对象中的key值
  6. JSON_REMOVE(json_doc, path[, path] ...) : 删除json文档中的指定值, 返回删除后的json串
  7. JSON_REPLACE(json_doc, path, val[, path, val] ...) : 替换json文档中的值
  8. JSON_SET​​​​​​(json_doc, path, val[, path, val] ...)  : 设置JSON文档中的值
    1. JSON_SET() 替换现有值并添加不存在的值。

    2. JSON_INSERT() 插入值而不替换现有值。

    3. JSON_REPLACE()替换 现有值。

5、JSON 属性函数: 

  1. JSON_DEPTH(json_doc) : 返回json最大深度
  2. JSON_LENGTH(json_doc[, path]) : 返回json文档长度-- json数组长度, JSON对象key个数
  3. JSON_TYPE(json_val) : 返回utf8mb4指示 JSON 值类型的字符串。这可以是对象、数组或标量类型
  4.  JSON_VALID(val) : 返回0 或 1 以指示是否为有效json串

6、JSON其它函数

  1.  JSON_PRETTY(json_val) : 格式化json文档
  2. JSON_STORAGE_FREE(json_val)  : json 列に残っているストレージ容量
  3. JSON_STORAGE_SIZE(json_val)  : json ドキュメントを保存するバイト数

おすすめ

転載: blog.csdn.net/zhoushimiao1990/article/details/121517825