从 MySQL 5.7.8 开始,MySQL 支持原生 JSON 数据类型,可以高效访问 JSON(JavaScript Object Notation)文档中的数据。参考:https://dev.mysql.com/doc/refman/5.7/en/json.html

第 34.1 节:创建带有主键和 JSON 字段的简单表

CREATE TABLE table_name (
    id INT NOT NULL AUTO_INCREMENT,
    json_col JSON,
    PRIMARY KEY(id)
);

第 34.2 节:插入简单的 JSON

INSERT INTO table_name (json_col) VALUES ('{"City": "Galle", "Description": "Best damn city in the world"}');

就是这么简单,但注意因为 JSON 字典的键必须用双引号括起来,整个字符串应该用单引号包裹。如果查询成功,数据将以二进制格式存储。

第 34.3 节:更新 JSON 字段

在前面的示例中,我们看到了如何将混合数据类型插入 JSON 字段。如果要更新该字段呢?我们将 scheveningen 添加到之前示例中名为 variations 的数组中。

UPDATE myjson SET dict = JSON_ARRAY_APPEND(dict, '$.variations', 'scheveningen') WHERE id = 2;

注意:

  1. $.variations 指向 json 字典中的 variations 数组。$ 符号代表整个 json 文档。关于 MySQL 识别的 json 路径的完整说明,请参考:https://dev.mysql.com/doc/refman/5.7/en/json-path-syntax.html
  2. 由于我们还没有关于使用 json 字段进行查询的示例,这里使用主键。

现在执行 SELECT * FROM myjson 将会看到更新后的内容。

第 34.4 节:将混合数据插入 JSON 字段

这将一个 json 字典插入到之前创建的表 myjson 中,其中一个成员是一个字符串数组。

INSERT INTO myjson(dict) VALUES('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}');

再次注意,需要小心使用单引号和双引号。整个内容必须用单引号包裹。

第 34.5 节:将数据转换为 JSON 类型

这将有效的 json 字符串转换为 MySQL JSON 类型:

SELECT CAST('[1,2,3]' AS JSON);
SELECT CAST('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}' AS JSON);

第 34.6 节:创建 JSON 对象和数组

JSON_OBJECT 创建 JSON 对象:

SELECT JSON_OBJECT('key1', col1, 'key2', col2, 'key3', 'col3') AS myobj;

JSON_ARRAY 创建 JSON 数组:

SELECT JSON_ARRAY(col1, col2, 'col3') AS myarray;

注意:myobj.key3 和 myarray[2] 中的 'col3' 是固定字符串。

也可以创建混合 JSON 数据:

SELECT JSON_OBJECT("opening", "Sicilian", "variations", JSON_ARRAY("pelikan", "dragon", "najdorf")) AS mymixed;