我注意到,当 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
;
结果:
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
以上证明了这一点,但我的问题是:
- 一定要一直这样吗?(是否有可以覆盖此行为的配置?)
- 此行为是由 JSON 还是 SQL Server 指定的?
- 这个设计决定背后的理由是什么?
- 如果 SQL Server 自动将不带引号的数字转换为整数,是否会带来性能优势?
JSON表示法定义遵循以下模式:
字符串的定义如下:
您可以看到引号在开头和结尾都是强制性的。
该值的定义如下:
请注意,您可以在此处提供字符串或数字,数字为:
结论:
我无法回答为什么 JSON 采用这种特定模式,并且这里的响应可能是基于意见的。
VARCHAR
SQL Server 在处理整数而不是字符串数据类型(如or )时总是会提高性能,NVARCHAR
因为它们的操作和比较速度更快,但要确保数据类型实际上是数字类型,而不是存储为字符串的数字。