JSON 数据类型(预览版)
适用于:Azure SQL 数据库Azure SQL 托管实例
以原生二进制格式存储 JSON 文档的新原生 json 数据类型。
json 类型提供 JSON 文档的高保真度存储,优化后便于查询和操作,与将 JSON 数据存储在 varchar 或 nvarchar 中相比,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
);
功能可用性
SQL Server 2016(13.x)中首次引入了 JSON 函数支持。 本机 json 类型是在 2024 年在 Azure SQL 数据库和 Azure SQL 托管实例中引入的。
json 支持所有数据库兼容性级别。
注意
JSON 数据类型目前以预览版提供Azure SQL 数据库和Azure SQL 托管实例(配置了 Always-up-to-date 更新策略)。
函数支持
所有 JSON 函数都支持 json 类型,无需更改代码或使用差异。
有关 JSON 函数的完整列表,请参阅 JSON 函数。
索引
JSON 数据没有特殊的索引类型。
json 类型不能用作 CREATE INDEX
语句中的键列。 但是,json 列可以指定为索引定义中包含的列。 此外,json 列可以出现在筛选索引的 WHERE
子句中。
转换
可以使用 CAST
或 CONVERT
从 json 类型以显式方式转换为 char、nchar、varchar 和 nvarchar 类型。 不允许进行所有隐式转换,这类似于 xml 的行为。 同样,只能将 char、nchar、varchar 和 nvarchar 以显式方式转换为 json 类型。
json 类型不能与 sql_variant 类型一起使用,也不能分配给 sql_variant 变量或列。 此限制类似于 varchar(max)、varbinary(max)、nvarchar(max)、xml 和基于 CLR 的数据类型。
可以使用 将现有列(如 varchar(max) 列转换为 ALTER TABLE
。 与 xml 数据类型类似,无法使用 将 ALTER TABLE
列转换为任何字符串或二进制类型。
有关详细信息,请参阅数据类型转换。
兼容性
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)。
- 目前,TDS >= 7.4(使用 UTF-8),varchar(max)
目前,
OPENJSON()
函数不接受 json 类型,当前采用隐式转换。 首先以显式方式转换为 nvarchar(max)。