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 |
|
BLOB, TEXTO |
|
BLOB MEDIO, TEXTO MEDIO |
|
LONGBLOB, TEXTO LARGO, JSON |
|
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:
从上面的结果可以得出结论:
- json列既可以存储json对象也可以存储json数组
- 获取json中特定key的值,可以使用 $.keyName , keyName加不加双引号都行
- 如果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值函数
- JSON_CONTAINS(target, candidate[, path]) : 判断candidate文档中是否包含target文档, 如果制定了path参数,则在 candidate 的 path 路径中寻找 target。 这里path不能使用通配符。
- JSON_CONTAINS_PATH(json_doc, one / all, path[, path] ...) : 判断json文档中是否包含制定路径。
-
'one'
: 如果文档中至少存在一个路径,则为 1,否则为 0。 -
'all'
: 如果文档中存在所有路径,则为 1,否则为 0。
-
-
JSON_KEYS(json_doc[, path]) : 返回json文档中的所有一级key, 如果path指定, 返回指定路径下的一级key
-
JSON_OVERLAPS(json_doc1, json_doc2) : 比较两个 JSON 文档是否具有任何共同的键值对或数组元素。
-
value MEMBER OF(json_array) : json数组中是否包含value值
-
JSON_SEARCH(json_doc, one / all, search_str[, escape_char[, path] ...]) : 返回json文档中给定字符串的路径。
-
'one'
:搜索在第一次匹配后终止并返回一个路径字符串。未定义首先考虑哪个匹配。当我们要匹配的值有多个, 返回第一个匹配到的value的key。 -
'all'
:搜索返回所有匹配的路径字符串,这样就不会包含重复的路径。如果有多个字符串,它们会自动包装为一个数组。数组元素的顺序未定义。 -
// 下面是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');
-
-
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值得函数
- JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...) : 将值添加到json文档中指定数组的末尾并返回结果。
- JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...) : 在JSON文档的指定位置插入指定值。
- JSON_INSERT(json_doc, path, val[, path, val] ...) : 在json文档的指定路径上插入值,并返回整个json串
- JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...): 合并多个json对象( json对象不是json数组)。 当多个json文档中存在相同的key时, 后面的key值会覆盖前面的json中的key值。
- 如果第一个参数不是json对象, 则会返回第二个参数, 无论第二个参数是否是json文档。
- 如果第二个参数不是json对象, 第一个参数是json对象, 返回第一个json对象
- JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...) : 合并多个json对象, 不同的是它不会将值覆盖。
- 可以合并json数组
- 如果多个json对象中有相同的key, 这里不是覆盖,而是合并多个json对象中的key值
- JSON_REMOVE(json_doc, path[, path] ...) : 删除json文档中的指定值, 返回删除后的json串
- JSON_REPLACE(json_doc, path, val[, path, val] ...) : 替换json文档中的值
- JSON_SET(json_doc, path, val[, path, val] ...) : 设置JSON文档中的值
-
JSON_SET() 替换现有值并添加不存在的值。
-
JSON_INSERT() 插入值而不替换现有值。
-
JSON_REPLACE()仅替换 现有值。
-
5、JSON 属性函数:
- JSON_DEPTH(json_doc) : 返回json最大深度
- JSON_LENGTH(json_doc[, path]) : 返回json文档长度-- json数组长度, JSON对象key个数
- JSON_TYPE(json_val) : 返回
utf8mb4
指示 JSON 值类型的字符串。这可以是对象、数组或标量类型 - JSON_VALID(val) : 返回0 或 1 以指示是否为有效json串
6、JSON其它函数
- JSON_PRETTY(json_val) : 格式化json文档
- JSON_STORAGE_FREE (json_val) : cuánto espacio de almacenamiento queda para la columna json
- JSON_STORAGE_SIZE(json_val) : el número de bytes para almacenar el documento json