麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
1225
2023-05-05
MySQL JSON数据类型如何操作?这里告诉你~
概述
mysql 自 5.7.8 版本开始,就支持了 json 结构的数据存储和查询,这表明了 mysql 也在不断的学习和增加 nosql 数据库的优点。但 mysql 毕竟是关系型数据库,在处理 json 这种非结构化的数据时,还是比较别扭的。
创建一个 JSON 字段的表
首先先创建一个表,这个表包含一个 json 格式的字段:
CREATE TABLE table_name ( id INT NOT NULL AUTO_INCREMENT, json_col JSON, PRIMARY KEY(id) );
上面的语句,主要注意 json_col 这个字段,指定的数据类型是 JSON。
插入一条简单的 JSON 数据
INSERT INTO table_name (json_col) VALUES ( '{"City": "Galle", "Description": "Best damn city in the world"}' );
上面这个 SQL 语句,主要注意 VALUES 后面的部分,由于 json 格式的数据里,需要有双引号来标识字符串,所以,VALUES 后面的内容需要用单引号包裹。
插入一条复杂的 JSON 数据
INSERT INTO table(col) VALUES( '{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}' );
这地方,我们插入了一个 json 数组。主要还是注意单引号和双引号的问题。
修改 JSON 数据
之前的例子中,我们插入了几条 JSON 数据,但是如果我们想修改 JSON 数据里的某个内容,怎么实现了?比如我们向 variations 数组里增加一个元素,可以这样:
UPDATE myjson SET dict=JSON_ARRAY_APPEND(dict,'$.variations','scheveningen') WHERE id = 2;
这个 SQL 语句中,$ 符合代表 JSON 字段,通过. 号索引到 variations 字段,然后通过 JSON_ARRAY_APPEND 函数增加一个元素。现在我们执行查询语句:
SELECT * FROM myjson
得到的结果是:
+----+-----------------------------------------------------------------------------------------+ | id | dict | +---+-----------------------------------------------------------------------------------------+ | 2 | { "opening" : "Sicilian" , "variations" : [ "pelikan" , "dragon" , "najdorf" , "scheveningen" ]} | +----+-----------------------------------------------------------------------------------------+ 1 row in set ( 0.00 sec)
关于 MySQL 中,JSON 数据的获取方法,参照官方链接 JSON Path Syntax
创建索引
MySQL 的 JSON 格式数据不能直接创建索引,但是可以变通一下,把要搜索的数据单独拎出来,单独一个数据列,然后在这个字段上键一个索引。下面是官方的例子:
mysql> CREATE TABLE jemp ( -> c JSON, -> g INT GENERATED ALWAYS AS (c-> "$.id" ), -> INDEX i (g) -> ); Query OK, 0 rows affected ( 0.28 sec) mysql> INSERT INTO jemp (c) VALUES > ( '{"id": "1", "name": "Fred"}' ), ( '{"id": "2", "name": "Wilma"}' ), > ( '{"id": "3", "name": "Barney"}'), ('{"id": "4", "name": "Betty"}' ); Query OK, 4 rows affected ( 0.04 sec) Records : 4 Duplicates: 0 Warnings : 0 mysql> SELECT c->> "$.name" AS name > FROM jemp WHERE g > 2 ; +--------+ | name | +--------+ | Barney | | Betty | +--------+ 2 rows in set ( 0.00 sec) mysql> EXPLAIN SELECT c->> "$.name" AS name > FROM jemp WHERE g > 2 \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: jemp partitions: NULL type: range possible_keys: i key: i key_len: 5 ref : NULL rows: 2 filtered: 100.00 Extra: Using where 1 row in set , 1 warning ( 0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level : Note Code : 1003 Message : /* select#1 */ select json_unquote(json_extract( `test` . `jemp` . `c` , '$.name')) AS `name` from `test` . `jemp`where ( `test` . `jemp` . `g` > 2 ) 1 row in set ( 0.00 sec)
这个例子很简单,就是把 JSON 字段里的 id 字段,单独拎出来成字段 g,然后在字段 g 上做索引,查询条件也是在字段 g 上。
字符串转 JSON 格式
把 json 格式的字符串转换成 MySQL 的 JSON 类型:
SELECT CAST('[1,2,3]' as JSON) ; SELECT CAST('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}' as JSON);
所有 MYSQL JSON 函数
Name Description JSON_APPEND() Append data to JSON document JSON_ARRAY() Create JSON array JSON_ARRAY_APPEND() Append data to JSON document JSON_ARRAY_INSERT() Insert into JSON array-> Return value from JSON column after evaluating path; equivalent to JSON_EXTRACT(). JSON_CONTAINS() Whether JSON document contains specific object at path JSON_CONTAINS_PATH() Whether JSON document contains any data at path JSON_DEPTH() Maximum depth of JSON document JSON_EXTRACT() Return data from JSON document->> Return value from JSON column after evaluating path and unquoting the result; equivalent to JSON_UNQUOTE(JSON_EXTRACT()). JSON_INSERT() Insert data into JSON document JSON_KEYS() Array of keys from JSON document JSON_LENGTH() Number of elements in JSON document JSON_MERGE() Merge JSON documents, preserving duplicate keys. Deprecated synonym for JSON_MERGE_PRESERVE() JSON_MERGE_PRESERVE() Merge JSON documents, preserving duplicate keys JSON_OBJECT() Create JSON object JSON_QUOTE() Quote JSON document JSON_REMOVE() Remove data from JSON document JSON_REPLACE() Replace values in JSON document JSON_SEARCH() Path to value within JSON document JSON_SET() Insert data into JSON document JSON_TYPE() Type of JSON value JSON_UNQUOTE() Unquote JSON value JSON_VALID() Whether JSON value is valid
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。