logo图片
MySql教程
MySql用户管理
MySQL数据库
MySql表格和视图
MySQL查询
MySQL索引
MySQL子句
MySQL授权
MySql控制流
MySQL条件
MySQL连接
MySQL键
MySQL触发器
MySQL聚合函数
MySQL常用
MySQL正则表达式
MySql差异性

MySQL JSON

JSON缩写为 JavaScript对象符号。它是一种 轻量级数据交换格式,与其他数据类型相似,并且可以很容易地被人类读取和写入。
通常, JSON 数据类型支持以下两种: 结构:
名称/值对链的集合,用作数据数组。 值的有序列表。
由于它管理作为数据数组的 名称-值对链中的各个值,因此我们可以使用单个命令来检索整个字段。这个有用的功能使我们可以快速检索大型系统中的数据。
MySQL 为以下内容提供支持: 版本5.7.8 中的本机JSON数据类型,以内部格式存储JSON文档,从而可以快速有效地读取文档对象。这种数据类型可以比我们过去使用的 JSON 文本格式更准确地存储JSON文档。 " https://www.lidihuo.com/mysql-versions">MySQL版本。
以下是JSON数据类型在存储JSON格式字符串方面的优势:
JSON列使我们可以存储JSON文档的自动验证。否则,我们会收到错误消息。 优化/快速存储格式意味着当服务器读取以二进制格式存储的JSON值时,它不需要从文本表示形式进行解析。二进制格式允许直接使用键或数组索引在JSON文档中搜索值,而无需读取整个值。
JSON文档所需的存储空间与 LONGBLOB LONGTEXT 的存储需求大致相同。
我们可以使用以下索引在MySQL表中定义JSON数据类型列:
CREATE TABLE table_name (
    ...
    json_column_name JSON,
    ... 
);
注意: 请注意,我们不能在JSON列中存储非null的默认值。而且,无法直接索引JSON列,因为它通过从JSON列中提取标量值来创建索引。如果我们想从JSON列中检索数据,则MySQL优化程序将搜索与JSON表达式匹配的兼容索引。

为什么使用JSON?

由于 用例,我们将在MySQL中使用JSON数据类型。 ,我们可以在其中使用临时替代方法。让我们借助于一个示例来理解它。
假设我们正在创建一个Web应用程序,并且希望将用户的配置或首选项保存在表中。通常,我们过去创建了一个单独的表,其中包含user_id,key和value字段,或者将其另存为格式化的字符串,以便可以在运行时对其进行解析。此方法对受限用户有用。如果用户列表很大且配置/首选项键更多,则此方法不好。
为克服这些问题,MySQL允许我们使用JSON数据类型字段来存储用户的配置或首选项,保存表的空间并单独存储记录,这将与访问网站的访客数量相同。

MySQL JSON数据类型示例

假设我们想跟踪访问我们网站的用户及其行为,例如,某些用户仅看到页面,而其他用户将访问页面并购买产品。让我们创建一个名为" 事件"的新表,该表将使用以下语句存储该信息:
CREATE TABLE events( 
  event_id int AUTO_INCREMENT PRIMARY KEY, 
  event_name varchar(75), 
  visitors varchar(25), 
  properties json, 
  browser_name json
);
事件ID用于唯一标识事件表中的每个事件。事件名称存储事件的名称,例如页面浏览,购买等。"访问者"列存储访问网站的用户信息以及 属性浏览器名称列用于保留JSON值。 Browser_name列存储访问者用来浏览网站的浏览器规范,例如浏览器名称,操作系统,分辨率等。
接下来,我们将使用INSERT语句,如下所示:
INSERT INTO events (event_name, visitors, properties, browser_name) 
VALUES (
  'page-view', 
   '2',
   '{"page": "/"}',
   '{ "name": "Google Chrome", "OS": "Windows", "resolution": {"x": 1920, "y": 1080} }'
),
('page-view', 
  '3',
  '{"page": "/products"}',
  '{ "name": "Safari", "OS": "UNIX", "resolution": {"x": 2560, "y": 1600} }'
),
(
  'page-view', 
  '1',
  '{"page": "/contacts"}',
  '{ "name": "Mozilla Firefox", "OS": "Mac", "resolution": {"x": 1920, "y": 1080} }'
),
(
  'purchase', 
   '4',
  '{"amount": 250}',
  '{ "name": "Google Chrome", "OS": "Windows", "resolution": {"x": 1280, "y": 800} }'
),
(
  'purchase', 
   '3',
  '{"amount": 350}',
  '{ "name": "Safari", "OS": "Mac", "resolution": {"x": 1600, "y": 900} }'
),
(
  'purchase', 
  '4',
  '{"amount": 400}',
  '{ "name": "Mozilla Firefox", "OS": "Windows", "resolution": {"x": 1280, "y": 800} }'
);
现在,我们可以验证表,执行 SELECT语句,如下所示:
mysql> SELECT * FROM events;
我们将看到如下输出:
MySQL JSON
假设我们要检索任何内容特定值,例如JSON列中的浏览器名称。我们可以使用列 路径运算符(->)来过滤这些类型的结果。请参见以下查询:
mysql> SELECT event_id, browser_name->'$.name' AS browser FROM events;
它将返回以下输出:
MySQL JSON
在此图像中,您会注意到用双引号引起来的浏览器列数据。如果要获取浏览器列的数据而没有任何引号,则需要使用 内联路径运算符(->>),如下所示:
mysql> SELECT event_id, browser_name->>'$.name' AS browser FROM events;
在下面的输出中,我们可以看到引号已被成功删除。
MySQL JSON
如果我们要 检索浏览器的使用情况,我们可以使用以下语句:
mysql> SELECT browser_name->>'$.name' AS browser, count(browser_name)
    FROM events GROUP BY browser_name->>'$.name';
我们将得到以下结果:
MySQL JSON
如果我们要 计算访问者的总收入,我们可以使用以下查询:
mysql> SELECT visitors, SUM(properties->>'$.amount') As total_revenue
FROM events WHERE properties->>'$.amount' > 0 GROUP BY visitors;
我们将得到如下结果:
MySQL JSON
昵称: 邮箱:
Copyright © 2020 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4