MySQL JSON 数据类型
简介:在本教程中,您将学习如何使用MySQL JSON数据类型在数据库中存储JSON文档。
MySQL JSON数据类型简介
从5.7.8版本开始,MySQL支持本机JSON数据类型。原生JSON数据类型允许您比以前版本中的JSON文本格式更有效地存储JSON文档。 MySQL以内部格式存储JSON文档,允许对文档元素进行快速读取访问。JSON二进制格式的结构允许服务器直接通过键或数组索引搜索JSON文档中的值,这非常快。 JSON文档的存储与存储LONGBLOB
或LONGTEXT
数据大致相同。
要定义数据类型为JSON的列,请使用以下语法:
CREATE TABLE table_name ( ... json_column_name JSON, ... );请注意,JSON列不能具有默认值。此外,无法直接索引 JSON列。相反,您可以在生成的列上创建一个索引,列包含从JSON列中提取的值。当您从JSON列查询数据时,MySQL优化器将在与JSON表达式匹配的虚拟列上查找兼容索引。
MySQL JSON数据类型示例
假设,我们必须在我们的网站上跟踪访客及其行为。有些访问者可能只是查看页面,而其他访问者可能会查看页面并购买产品。为了存储这些信息,我们将创建一个表名为events
。
CREATE TABLE events( id int auto_increment primary key, event_name varchar(255), visitor varchar(255), properties json, browser json );事件表中的每个事件都具有
id
唯一标识事件的事件。事件还具有名称,例如,页面浏览,购买等。visitor
列用于存储访问者信息。
properties
与browser
列是JSON列。它们用于存储事件的属性以及访问者用于浏览网站的浏览器规范。
让我们在events
表格中插入一些数据:
INSERT INTO events(event_name, visitor,properties, browser) VALUES ( 'pageview', '1', '{ "page": "/" }', '{ "name": "Safari", "os": "Mac", "resolution": { "x": 1920, "y": 1080 } }' ), ('pageview', '2', '{ "page": "/contact" }', '{ "name": "Firefox", "os": "Windows", "resolution": { "x": 2560, "y": 1600 } }' ), ( 'pageview', '1', '{ "page": "/products" }', '{ "name": "Safari", "os": "Mac", "resolution": { "x": 1920, "y": 1080 } }' ), ( 'purchase', '3', '{ "amount": 200 }', '{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1600, "y": 900 } }' ), ( 'purchase', '4', '{ "amount": 150 }', '{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1280, "y": 800 } }' ), ( 'purchase', '4', '{ "amount": 500 }', '{ "name": "Chrome", "os": "Windows", "resolution": { "x": 1680, "y": 1050 } }' );要从JSON列中提取值,请使用列路径运算符(
->
)。
SELECT id, browser->'$.name' browser FROM events;此查询返回以下输出:
+----+-----------+ | id | browser | +----+-----------+ | 1 | "Safari" | | 2 | "Firefox" | | 3 | "Safari" | | 4 | "Firefox" | | 5 | "Firefox" | | 6 | "Chrome" | +----+-----------+ 6 rows in set (0.01 sec)请注意,
browser
列中的数据由引号括起。要删除引号,请使用内联路径运算符(->>
),如下所示:
SELECT id, browser->>'$.name' browser FROM events;正如您在以下输出中所看到的,引号已被删除:
+----+---------+ | id | browser | +----+---------+ | 1 | Safari | | 2 | Firefox | | 3 | Safari | | 4 | Firefox | | 5 | Firefox | | 6 | Chrome | +----+---------+ 6 rows in set (0.00 sec)要获取浏览器用法,可以使用以下语句:
SELECT browser->>'$.name' browser, count(browser) FROM events GROUP BY browser->>'$.name';查询的输出如下:
+---------+----------------+ | browser | count(browser) | +---------+----------------+ | Chrome | 1 | | Firefox | 3 | | Safari | 2 | +---------+----------------+ 3 rows in set (0.00 sec)要计算访问者的总收入,请使用以下查询:
SELECT visitor, SUM(properties->>'$.amount') revenue FROM events WHERE properties->>'$.amount' > 0 GROUP BY visitor;这是输出:
+---------+---------+ | visitor | revenue | +---------+---------+ | 3 | 200 | | 4 | 650 | +---------+---------+ 2 rows in set (0.01 sec)在本教程中,您了解了MySQL JSON数据类型以及如何使用它来在数据库中存储JSON文档。