MySQL JSON

17 Mar 2025 | 4 分钟阅读

JSON 缩写为 JavaScript Object Notation。它是一种轻量级数据交换格式,与其他数据类型类似,易于人类阅读和书写。它也能轻松地被机器解析和生成。

通常,JSON 数据类型支持两种结构:

  • 一系列名称/值对的集合,充当数据数组。
  • 一系列有序的值。

由于它以一系列名称-值对的形式管理各个值,充当数据数组,我们可以通过单个命令检索整个字段。这一有用的特性允许我们在大型系统中快速检索数据。

MySQL5.7.8 版本开始支持原生 JSON 数据类型,它以内部格式存储 JSON 文档,从而实现对文档对象的快速高效读取访问。与我们过去使用的MySQL 版本中的JSON 文本格式相比,这种数据类型可以更准确地存储 JSON 文档。

JSON 数据类型相较于存储 JSON 格式字符串的优势如下:

  • JSON 列允许我们存储 JSON 文档的自动验证。否则,将会收到错误。
  • 优化的/快速的存储格式意味着当服务器读取二进制格式存储的 JSON 值时,无需从文本表示形式进行解析。二进制格式允许直接通过键或数组索引搜索 JSON 文档中的值,而无需读取整个值。

JSON 文档所需的存储空间大致与 LONGBLOBLONGTEXT 的存储需求相当。

我们可以使用以下索引在 MySQL 表中定义 JSON 数据类型列:

注意:需要注意的是,我们不能为 JSON 列存储非 NULL 的默认值。此外,JSON 列不能直接索引,因为它会通过从 JSON 列中提取标量值来创建索引。如果我们想从 JSON 列中检索数据,MySQL 优化器会搜索与 JSON 表达式兼容的索引。

我们为什么使用 JSON?

我们将在 MySQL 中使用 JSON 数据类型,因为它具有用例,我们可以将其用作一种临时方法。让我们通过一个例子来理解它。

假设我们正在创建一个 Web 应用程序,并想在表中保存用户的配置或偏好。通常,我们过去会创建一个包含 user_id、key 和 value 字段的单独表,或者将其保存为格式化字符串,以便在运行时进行解析。这种方法对有限数量的用户来说是好的。如果用户列表很大,并且配置/偏好键更多,这种方法就不好了。

为了克服这些问题,MySQL 允许我们使用 JSON 数据类型字段来存储用户的配置或偏好,这样可以节省表空间,并单独存储记录,其数量将与访问网站的访客数量相同。

MySQL JSON 数据类型示例

假设我们想跟踪访问我们网站的用户及其操作,例如有些用户只查看页面,而有些用户会访问页面并购买产品。让我们创建一个名为“events”的新表,它将使用以下语句存储此信息:

Event id 用于唯一标识 events 表中的每个事件。event name 存储事件的名称,例如 page-view、purchase 等。visitor 列存储访问网站的用户信息,propertiesbrowser_name 列用于保存 JSON 值。Browser_name 列存储浏览器规范,例如访客用于浏览网站的浏览器名称、操作系统、分辨率等。

接下来,我们将使用下面的 INSERT 语句将数据插入此表中:

现在,我们可以验证表,执行如下所示的 SELECT 语句

我们将看到如下输出:

MySQL JSON

假设我们想检索 JSON 列中的任何特定值,例如浏览器名称。我们可以使用路径运算符 (->) 来过滤这些类型的结果。请看下面的查询:

它将返回以下输出:

MySQL JSON

在此图像中,您会注意到浏览器列的数据被双引号包围。如果您想在没有引号的情况下获取浏览器列的数据,我们需要使用内联路径运算符 (->>),如下所示:

在下面的输出中,我们可以看到引号已被成功移除。

MySQL JSON

如果我们想检索浏览器使用情况,我们可以使用如下语句:

我们将得到如下结果:

MySQL JSON

如果我们想计算访客的总收入,我们可以使用如下查询:

我们将得到如下结果:

MySQL JSON
下一主题MySQL 标准差