必须引用数字 JSON 键吗?

you*_*gme 6 sql-server t-sql json

我已经注意到,当 TSQL JSON 字符串中的数字时,键值值可能不加引号,但似乎必须始终引用关键组件。

select 1, isjson(''), 'empty string' union
select 2, isjson('{}'), 'empty braces' union
select 3, isjson('{1:2}'), 'unquoted both, numerals both' union
select 4, isjson('{1:"2"}'), 'unquoted key, numerals both' union
select 5, isjson('{"1":2}'), 'unquoted value, numerals both' union
select 6, isjson('{"1":"2"}'), 'quoted both, numerals both' union
select 7, isjson('{a:b}'), 'unquoted both, alpha both' union
select 8, isjson('{a:"b"}'), 'unquoted key, alpha both' union
select 9, isjson('{"a":b}'), 'unquoted value, alpha both' union
select 10, isjson('{"a":"b"}'), 'quoted both, alpha both'
order by 1
;
Run Code Online (Sandbox Code Playgroud)

结果:

1   0   empty string
2   1   empty braces
3   0   unquoted both, numerals both
4   0   unquoted key, numerals both
5   1   unquoted value, numerals both
6   1   quoted both, numerals both
7   0   unquoted both, alpha both
8   0   unquoted key, alpha both
9   0   unquoted value, alpha both
10  1   quoted both, alpha both
Run Code Online (Sandbox Code Playgroud)

以上证明了这一点,但我的问题是:

  1. 必须总是这样吗?(是否有可以覆盖此行为的配置?)
  2. 这种行为是由 JSON 还是 SQL Server 指定的?
  3. 这个设计决定背后的基本原理是什么?
  4. 如果 SQL Server 自动将不带引号的数字转换为整数,是否会提高性能?

EzL*_*zLo 8

JSON符号定义遵循下面的模式:

![在此处输入图片说明

字符串的定义如下:

在此处输入图片说明

您可以看到引号在开头和结尾都是强制性的。

的定义如下:

在此处输入图片说明

请注意,在这里您可以提供字符串数字数字为:

在此处输入图片说明

结论

  • 键的开头和结尾都必须有引号。
  • 如果您提供数字,则可以避免在价值端使用引号。

我无法回答 JSON 为何采用这种特定模式,这里的回复可能是基于意见的。

SQL Server 在处理字符串数据类型(如VARCHARNVARCHAR)上的整数时总是会获得性能提升,因为它们的操作和比较速度更快,但请确保数据类型实际上是数字类型而不是存储为字符串的数字。