关键字:
KingbaseES、JSON操作符、MySQL
1.产品新特性
在Mysql中,JSON操作符允许用户对JSON数据类型的列中执行各种操作:操作符‘->’用于从JSON对象中提取一个特定的键的值。例如,json_column -> ‘$.key’将返回JSON对象中为‘key’的值;操作符‘->>’与操作符’->’类似,但返回的是提取值的字符串表示,例如,json_column ->> ‘$.key’将返回键为‘key’的值作为字符串。 在KingbaseES最新版本中,我们兼容了MySQL中的‘->’操作符以及‘->>’操作符,通过使用这些操作符,用户可以方便地在JSON数据类型的列中执行各种操作。
2.新兼容JSON操作符
2.1 ‘->’操作符
2.1.1 操作符语法
操作符语法 | 左操作数类型 | 右操作数类型 | 返回类型 | 索引 |
---|---|---|---|---|
json-> path | json类型 | jsonpath类型 | json类型 | 不支持 |
2.1.2 功能描述
‘->’操作符其实是函数JSON_EXTRACT只有两个参数时的别名,其功能是返回json文档中指定path对应的值。JSON_EXTRACT(json_doc,path[,path]…)函数可以有多个path,而‘->’操作符只能指定一个path。且不支持索引:
Mysql> create index t_idx_a on t ((a->'$.a'));
ERROR 3753 (42000): Cannot create a functional index on a function that returns a JSON or GEOMETRY value.
2.1.3 功能举例
Mysql > select * from jsontest;
+------------------------+
| json |
+------------------------+
| {“a”:”b”} |
| [1, 2, ,3] |
+------------------------+
Mysql > select json -> ‘$.a’ from jsontest;
+------------------------+
| json -> ‘$.a’ |
--------------------------
| “b” |
| NULL |
+------------------------+
Mysql > select json -> ‘$.a’ from jsontest;
+------------------------+
| json -> ‘$[0]’ |
--------------------------
| {“a”:”b”} |
| 1 |
+------------------------+
2.2 ‘->>’操作符
2.2.1 操作符语法
操作符语法 | 左操作数类型 | 右操作数类型 | 返回类型 | 索引 |
---|---|---|---|---|
json->> path | json类型 | jsonpath类型 | 字符串 | 不支持 |
2.2.2 功能描述
‘->>’操作符是‘->’操作符的扩展,以字符串形式返回指定json文档中指定path对应的值,并取消引用。等同于将‘->’操作符所得结果以字符串形式返回。也可用JSON_UNQUOTE( JSON_EXTRACT(json, path) )函数表示。且不支持索引:
Mysql> create index t_idx_a on t ((a->>'$.a'));
ERROR 3757 (HY000): Cannot create a functional index on an expression that returns a BLOB or TEXT. Please consider using CAST.
下面3中形式将返回相同的值:
- JSON_UNQUOTE( JSON_EXTRACT(json, path) )
- JSON_UNQUOTE(json -> path)
- json->>path
2.2.3 功能举例
Mysql > select * from jsontest;
+------------------------+
| json |
+------------------------+
| {“a”:”b”} |
| [1, 2, ,3] |
+------------------------+
Mysql > select json ->> ‘$.a’ from jsontest;
+------------------------+
| json -> ‘$.a’ |
---------------------------
| b |
| NULL |
+------------------------+
Mysql > select json ->> ‘$.a’ from jsontest;
+-------------------------+
| json -> ‘$[0]’ |
---------------------------
| {“a”:”b”} |
| 1 |
+-------------------------+
3.金仓数据库KingbaseES的实现方式
在金仓数据库中,上述两种操作符在插件mysql_json中实现,用户在使用时需要在mysql模式下create插件:
test=# show database_mode;
database_mode
---------------
mysql
(1 row)
test=# create extension mysql_json ;
CREATE EXTENSION
之后用户可以如同MySQL一样,对JSON列使用操作符进行操作。
4.总结和展望
该功能兼容了MySQL中的JSON操作符。功能虽小,但金仓数据库正在遵循国际标准并提高与MySQL等其他数据的兼容性,以便更好地与现有的生态系统集成,从而进一步提升用户对产品的认可度以及信任度,吸引更多的用户采用和推广。