生死看淡,不服就干!

MySQL--Json

Posted on By 笑东风

Json基础


在MYSQL 5.7.8版本开始,MYSQL支持原生的JSON数据类型

Json 数组使用[]来包含数据,数组中可以存放不同的数据类型,如:
["abc", 10, null, true, false]

Json数组中元素可以是普通类型,也可以是数组或Json对象,如:

Json 对象使用{}来包含数据,如:
{"k1": "value", "k2": 10}

Json的键值对的值部分可以是数组,也可以是Josn对象,如
{"k1": "value", "k2": [10, 20]}

使用JSON_TYPE() 函数来查看Json类型
SELECT JSON_TYPE('"hello"');

使用JSON_ARRAY()函数来生成JSON数组
SELECT JSON_ARRAY('a', 1, NOW());

使用JSON_OBJECT()来生成JSON对象
SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');

使用 JSON_MERGE来合并数组
SELECT JSON_MERGE('["a", 1]', '{"key": "value"}');

使用CHARSET和COLLATION来查看JSON对象使用的字符集
SELECT CHARSET(@j), COLLATION(@j);

使用JSON_EXTRACT来获取JSON对象中特定KEY的VALUE,Key部分可以使用正在表达式或下标或keyName
SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');

使用JSON_SET来设置JSON对象中特定KEY的值


Json Demo


-- 创建表使用Json类型
DROP TABLE TB_JosnTest;
CREATE TABLE TB_JosnTest
(
id int auto_increment primary key,
jsonData json)
engine=innodb;

-- 插入数据,注意JSON数据以{}包裹
INSERT INTO TB_JosnTest(jsonData)
SELECT '{"read_cost": "1.00","eval_cost": "0.60","prefix_cost": "6.20","data_read_per_join": "47"}';

INSERT INTO TB_JosnTest(jsonData)
SELECT '{"read_cost": "2.20","eval_cost": "0.60","prefix_cost": "2.80","data_read_per_join": "47"}';

-- 使用JSON_EXTRACT来访问Json数据
SELECT id,JSON_EXTRACT(jsonData, '$.read_cost') AS C1
FROM TB_JosnTest
WHERE JSON_EXTRACT(jsonData, '$.read_cost')='1.00'

+----+--------+
| id | C1     |
+----+--------+
|  1 | "1.00" |
+----+--------+