JSON 数据类型(预览版)

适用于:Azure SQL 数据库

以原生二进制格式存储 JSON 文档的新原生 json 数据类型。

json 类型提供 JSON 文档的高保真度存储,优化后便于查询和操作,与将 JSON 数据存储在 varcharnvarchar 中相比,json 类型具有以下优势:

  • 提高读取效率,因为文档已经过分析
  • 提高写入效率,因为查询可以在不访问整个文档的情况下更新单个值
  • 提高存储效率,针对压缩进行优化
  • 仍与现有代码相兼容

json 类型使用 UTF-8 编码 Latin1_General_100_BIN2_UTF8 在内部存储数据。 此行为与 JSON 规范相符。

有关查询 JSON 数据的详细信息,请参阅在 SQL Server 中处理 JSON 数据

示例语法

json 类型的使用语法类似于表中的所有其他 SQL Server 数据类型。

column_name JSON [NOT NULL | NULL] [CHECK(constraint_expression)] [DEFAULT(default_expression)]

json 类型可用于 CREATE TABLE 语句中包含的列定义,例如:

CREATE TABLE Orders (order_id int, order_details JSON NOT NULL);

可以将约束指定为列定义的一部分,例如:

CREATE TABLE Orders (order_id int, order_details JSON NOT NULL
   CHECK (JSON_PATH_EXISTS(order_details, '$.basket') = 1
);

功能可用性

JSON 支持是在 SQL Server 2016 (13.x) 中首次引入的,主要采用 JSON 函数的形式。 新的原生 json 类型是在 2024 年引入的,首先在 Azure SQL 平台上推出。

json 支持所有数据库兼容性级别。

注意

目前,json 类型的预览版在 Azure SQL 数据库中可用。

函数支持

所有 JSON 函数都支持 json 类型,无需更改代码或使用差异。

有关 JSON 函数的完整列表,请参阅 JSON 函数

索引

JSON 数据没有特殊的索引类型。

json 类型不能用作 CREATE INDEX 语句中的键列。 但是,json 列可以指定为索引定义中包含的列。 此外,json 列可以出现在筛选索引的 WHERE 子句中。

转换

可以使用 CASTCONVERTjson 类型以显式方式转换为 charncharvarcharnvarchar 类型。 不允许进行所有隐式转换,这类似于 xml 的行为。 同样,只能将 charncharvarcharnvarchar 以显式方式转换为 json 类型。

json 类型不能与 sql_variant 类型一起使用,也不能分配给 sql_variant 变量或列。 此限制类似于 varchar(max)、varbinary(max)、nvarchar(max)、xml 和基于 CLR 的数据类型。

有关详细信息,请参阅数据类型转换

兼容性

json 类型可用作用户定义函数中的参数或返回类型,也可以用作存储过程的参数。 json 类型与触发器和视图兼容。

目前,bcp 工具的本机格式将 json 文档包含为 varchar 或 nvarchar。 必须指定格式化文件,以指定 json 数据类型列。

不允许使用 CREATE TYPE 为 json 类型创建别名类型。 这与 xml 类型的行为相同。

SELECT ... INTO JSON 类型一起使用将创建一个包含 JSON 类型的表。

限制

  • CAST ( ... AS JSON) 的行为返回 json 类型,但 sp_describe_first_result_set 系统存储过程没有正确返回 json 数据类型。 因此,许多数据访问客户端和驱动程序将看到 varchar 或 nvarchar 数据类型。

    • 目前,TDS >= 7.4(使用 UTF-8)支持将看到 varchar(max)Latin_General_100_bin2_utf8
    • 目前,TDS < 7.4 支持将看到使用数据库排序规则的 nvarchar(max)
  • 目前,OPENJSON() 函数不接受 json 类型,当前采用隐式转换。 首先以显式方式转换为 nvarchar(max)