Manipulación de datos MYSQL JSON

Documento recomendado:  sitio web oficial de mysql -- función JSON

Mysql ha introducido el tipo de datos json desde 5. 7. En comparación con los caracteres binarios que almacenan blobs y los datos de tipo texto que almacenan texto, los datos almacenados en json verificarán si se ajustan al formato json. Y la longitud máxima del texto que json puede almacenar es la misma que la longitud del texto de longBlob y longText.

tipo de datos longitud de almacenamiento
TINYBLOB、TINYTEXT

 L+ 1 byte, donde  L<2^{8}

BLOB, TEXTO

 L+ 2 bytes, donde  L2^{16}

BLOB MEDIO, TEXTO MEDIO

 L+ 3 bytes, donde  L2^{24}

LONGBLOB, TEXTO LARGO, JSON

 L+ 3 bytes, donde  L2^{32}

Función de procesamiento JSON en mysql: 

función describir
-> Devuelve el valor de la columna JSON después de evaluar la ruta; equivalente a JSON_EXTRACT().
->> Devuelve el valor de la columna JSON después de evaluar la ruta y desreferenciar el resultado; equivalente a JSON_UNQUOTE(JSON_EXTRACT()).
JSON_ARRAY() Crear matriz JSON
JSON_ARRAY_APPEND() Agregar datos al documento JSON
JSON_ARRAY_INSERT() Insertar matriz JSON
JSON_CONTIENES() Si el documento JSON contiene el objeto específico en la ruta
JSON_CONTAINS_PATH() ¿El documento JSON contiene datos en la ruta?
JSON_DEPTH() Profundidad máxima de documentos JSON
JSON_EXTRACT() Devolver datos de un documento JSON
JSON_INSERTAR() Insertar datos en el documento JSON
JSON_KEYS() Una matriz de claves del documento JSON
JSON_LENGTH() El número de elementos en el documento JSON
JSON_MERGE() Combine documentos JSON, conservando las claves duplicadas. Sinónimo JSON_MERGE_PRESERVE() obsoleto (obsoleto)
JSON_MERGE_PATCH() Combinar documentos JSON, reemplazando valores por claves duplicadas
JSON_MERGE_PRESERVE() Combinar documentos JSON, conservando claves duplicadas
JSON_OBJECT() Crear objeto JSON
JSON_OVERLAPS() (Versión 8.0.17) Compara dos documentos JSON y devuelve VERDADERO (1) si tienen pares clave-valor o elementos de matriz en común, FALSO (0) de lo contrario
JSON_BONITO() Imprima documentos JSON en formato legible por humanos
JSON_QUOTE() Citando un documento JSON
JSON_REMOVE() Eliminar datos del documento JSON
JSON_REPLACE() Reemplazar valores en documentos JSON
JSON_SCHEMA_VALID() (Versión 8.0.17) Valida un documento JSON contra un esquema JSON; devuelve 1 si el documento se valida contra el esquema, 0 de lo contrario
JSON_SCHEMA_VALIDATION_REPORT() (Versión 8.0.17) Valida documentos JSON contra JSON Schema; devuelve un informe sobre los resultados de la validación en formato JSON, incluido el éxito o el fracaso y el motivo del error
JSON_BUSCAR() Rutas de valor en documentos JSON
JSON_SET() Insertar datos en el documento JSON
JSON_STORAGE_FREE() Espacio liberado en la representación binaria del valor de la columna JSON después de una actualización parcial
JSON_STORAGE_SIZE() espacio para almacenar la representación binaria del documento JSON
JSON_TABLE() Devolver datos en una expresión JSON como una tabla relacional
JSON_TYPE() Tipos de valores JSON
JSON_UNQUOTE() desreferenciar valor JSON
JSON_VALID() ¿Es válido el valor JSON?
JSON_VALUE() (Versión 8.0.21) Extrae el valor del documento JSON en la ubicación a la que apunta la ruta proporcionada; devuelve este valor como VARCHAR(512) o el tipo especificado
MIEMBRO DE() (Versión 8.0.17) Devuelve 1 si el primer operando coincide con cualquier elemento de la matriz JSON pasado como segundo operando; de lo contrario, devuelve 0

Se introducen funciones de uso común: 

Crear una tabla e insertar datos: 

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)  : cuánto espacio de almacenamiento queda para la columna json
  3. JSON_STORAGE_SIZE(json_val)  : el número de bytes para almacenar el documento json

Supongo que te gusta

Origin blog.csdn.net/zhoushimiao1990/article/details/121517825
Recomendado
Clasificación