暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库学习Q&A 077:OceanBase数据库如何创建 JSON 值?

JSON 文本结构

JSON 文本结构包括字符、字符串、数字和三个字面量名称。在任何一个结构字符的之前或之后都允许使用各种间隔符,包括空格、水平制表符、换行和回车等。

       开始数组 =  [ 左方括号

       开始对象 =  { 左大括号

       结束数组 =  ] 右方括号

       最终对象 =  } 右大括号

       名称分隔符 = : 冒号

       值分隔符 = , 逗号

对象

对象的结构表示为一对大括号包含 0 个或多个名称/值对(或成员)。对象内的名称应该是唯一的。一个名称是一个字符串,每个名称后面都有一个冒号,用于分隔名称和值。单个逗号用于多个名称/值的分割。 示例如下:

{ "NAME": "SAM",  "Height": 175, "Weight":  100,"Registered" : false}

数组

数组的结构表示为一个方括号包含 0 个或多个值(也称为元素)。数组元素用逗号分隔,不要求数组中的值相同。

示例如下:

["abc", 10, null, true, false]

数字

数字使用十进制格式,包含一个整数分量,也可能是以一个减号(-)为前缀(可选),后面可以跟一个分数部分和/或指数部分。不允许前导为零。小数部分是一个小数点后跟一位或多位数字。指数部分以大写或小写字母 E 开头,后面可以跟一个加号(+)或减号(-)。E 和可选符号后可以跟随一位或多位数字。

示例如下:

[100, 0, -100, 100.11, -12.11, 10.22e2, -10.22e2]

字符串

一个字符串开始和结束都使用引号(")。所有 Unicode 字符都可以放在引号内,除了必须转义的字符(包括引号、反斜线和控制字符)。

JSON 文本应以 UTF-8、UTF-16 或 UTF-32 编码。 默认的编码为 UTF-8。

示例如下:

{"Url":    "http://www.example.com/image/481989943"}

创建 JSON 值

OceanBase 数据库支持对 JSON 类型执行以下 DDL 操作:

  • 创建带有 JSON 列的表。

  • 增加/删除 JSON 列。

  • 基于生成列为 JSON 类型的列创建索引。

使用限制

用户可以在每个表上创建多个 JSON 类型的列,但是具有以下的限制:

  • JSON 类型的列不能作为 PRIMARY KEYFOREIGN KEY 和 UNIQUE KEY,但是可以添加 NOT NULL 或 CHECK 约束。

  • JSON 类型的列上不可以包含默认值。

  • JSON 类型的列不能作为分区键。

  • JSON 数据长度不能超过 LONGTEXT 的长度,每个 JSON 对象或数组的最大深度为 99。

示例

示例 1:基础 DDL 操作。

obclient> CREATE TABLE tbl1 (id INT PRIMARY KEY, docs JSON NOT NULL, docs1 JSON);
Query OK, 0 rows affected

obclient> ALTER TABLE tbl1 MODIFY docs JSON CHECK(docs <'{"a" : 100}');
Query OK, 0 rows affected

obclient> CREATE TABLE json_tab(
      id         INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
      json_info  JSON COMMENT 'JSON 数据',
      json_id    INT GENERATED ALWAYS AS (json_info -> '$.id') COMMENT 'JSON 数据的虚拟字段',
      json_name  VARCHAR(5) GENERATED ALWAYS AS (json_info -> '$.NAME'),
      index      json_info_id_idx (json_id)
    )COMMENT 'json 示例表';
Query OK, 0 rows affected 
 
obclient> ALTER TABLE json_tab ADD COLUMN json_info1 JSON;
Query OK, 0 rows affected

obclient> ALTER TABLE json_tab ADD INDEX (json_name);
Query OK, 0 rows affected

obclient> ALTER TABLE json_tab drop COLUMN json_info1;
Query OK, 0 rows affected

示例 2: 使用生成列为指定 key 创建索引。

obclient> CREATE TABLE jn ( c JSON, g INT GENERATED ALWAYS AS (c->"$.id"));
Query OK, 0 rows affected 

obclient> CREATE INDEX idx1 ON jn(g);
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

obclient> INSERT INTO jn (c) VALUES
      ('{"id": "1", "name": "Fred"}'), ('{"id": "2", "name": "Wilma"}'),
      ('{"id": "3", "name": "Barney"}'), ('{"id": "4", "name": "Betty"}');
Query OK, 4 rows affected
Records: 4  Duplicates: 0  Warnings: 0

obclient> SELECT c->>"$.name" AS name FROM jn WHERE g <= 2;
+-------+
| name  |
+-------+
| Fred  |
| Wilma |
+-------+
2 rows in set

obclient> EXPLAIN SELECT c->>"$.name" AS name FROM jn WHERE g <= 2\G
*************************** 1. row ***************************
Query Plan: =========================================
|ID|OPERATOR  |NAME      |EST. ROWS|COST|
-----------------------------------------
|0 |TABLE SCAN|jemp(idx1)|2        |92  |
=========================================

Outputs & filters:
-------------------------------------
  0 - output([JSON_UNQUOTE(JSON_EXTRACT(jemp.c, '$.name'))]), filter(nil),
      access([jemp.c]), partitions(p0)

1 row in set
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论