Sql 服务器 OPENJSON returns unicode 字符串
Sql Server OPENJSON returns unicode string
我对 SQL 服务器和 JSON 有问题:/
有很多 JSON 字符串来自远程数据库(我只有读取权限)。问题是所有这些都被解析为 unicode,我不知道如何将它们转换为 UTF-8!
看看这个JSON例如:
{
"0":{
"id":1,
"name":"\u062a\u0646"
},
"1":{
"id":2,
"name":"\u0628\u0633\u062a\u0647 10\u062a\u0627\u06cc\u06cc"
},
"2":{
"id":3,
"name":"\u0639\u062f\u062f 10\u062a\u0627\u06cc\u06cc"
},
"5":{
"id":6,
"name":"\u0639\u062f\u062f 1000\u062a\u0627\u06cc\u06cc"
},
"6":{
"id":7,
"name":"\u06a9\u06cc\u0644\u0648\u06af\u0631\u0645"
}
}
如您所见,字段 name
被解析为 unicode。我这样做是为了将数据提取到 table:
SELECT Units.*
FROM OPENJSON(@Json) AS i
CROSS APPLY OPENJSON(i.[value]) WITH (
[Id] INT '$.id',
[Name] NVARCHAR(MAX) '$.name'
) AS Units
然后它会显示如下结果:
- Id: 1, Name: \u062a\u0646
- Id: 2, Name: \u0628\u0633\u062a\u0647 10\u062a\u0627\u06cc\u06cc
- ...
但我需要这样的结果:
- Id: 1, Name: Êft
- Id: 2, Name: عدد 10تاوی
- ...
ECMA-404 标准的一些解释:一个 JSON 字符串是用引号 (U+0022) 包裹的 Unicode 代码点序列。 ...如果代码点位于基本多语言平面(U+0000 到
U+FFFF),那么它可以表示为一个六字符序列:一个反斜线,后跟小写字母 u,再后跟编码代码点的四个十六进制数字。
似乎名称被转义了,所以一个可能的选择是替换转义的 \
:
JSON:
DECLARE @json nvarchar(max) = N'{
"0":{
"id":1,
"name":"\u062a\u0646"
},
"1":{
"id":2,
"name":"\u0628\u0633\u062a\u0647 10\u062a\u0627\u06cc\u06cc"
},
"2":{
"id":3,
"name":"\u0639\u062f\u062f 10\u062a\u0627\u06cc\u06cc"
},
"5":{
"id":6,
"name":"\u0639\u062f\u062f 1000\u062a\u0627\u06cc\u06cc"
},
"6":{
"id":7,
"name":"\u06a9\u06cc\u0644\u0648\u06af\u0631\u0645"
}
}'
声明:
SELECT Units.*
FROM OPENJSON(REPLACE(@Json, N'\u', N'\u')) AS i
CROSS APPLY OPENJSON(i.[value]) WITH (
[Id] INT '$.id',
[Name] NVARCHAR(MAX) '$.name'
) AS Units
结果:
Id Name
1 تن
2 بسته 10تایی
3 عدد 10تایی
6 عدد 1000تایی
7 کیلوگرم
我对 SQL 服务器和 JSON 有问题:/
有很多 JSON 字符串来自远程数据库(我只有读取权限)。问题是所有这些都被解析为 unicode,我不知道如何将它们转换为 UTF-8!
看看这个JSON例如:
{
"0":{
"id":1,
"name":"\u062a\u0646"
},
"1":{
"id":2,
"name":"\u0628\u0633\u062a\u0647 10\u062a\u0627\u06cc\u06cc"
},
"2":{
"id":3,
"name":"\u0639\u062f\u062f 10\u062a\u0627\u06cc\u06cc"
},
"5":{
"id":6,
"name":"\u0639\u062f\u062f 1000\u062a\u0627\u06cc\u06cc"
},
"6":{
"id":7,
"name":"\u06a9\u06cc\u0644\u0648\u06af\u0631\u0645"
}
}
如您所见,字段 name
被解析为 unicode。我这样做是为了将数据提取到 table:
SELECT Units.*
FROM OPENJSON(@Json) AS i
CROSS APPLY OPENJSON(i.[value]) WITH (
[Id] INT '$.id',
[Name] NVARCHAR(MAX) '$.name'
) AS Units
然后它会显示如下结果:
- Id: 1, Name: \u062a\u0646
- Id: 2, Name: \u0628\u0633\u062a\u0647 10\u062a\u0627\u06cc\u06cc
- ...
但我需要这样的结果:
- Id: 1, Name: Êft
- Id: 2, Name: عدد 10تاوی
- ...
ECMA-404 标准的一些解释:一个 JSON 字符串是用引号 (U+0022) 包裹的 Unicode 代码点序列。 ...如果代码点位于基本多语言平面(U+0000 到 U+FFFF),那么它可以表示为一个六字符序列:一个反斜线,后跟小写字母 u,再后跟编码代码点的四个十六进制数字。
似乎名称被转义了,所以一个可能的选择是替换转义的 \
:
JSON:
DECLARE @json nvarchar(max) = N'{
"0":{
"id":1,
"name":"\u062a\u0646"
},
"1":{
"id":2,
"name":"\u0628\u0633\u062a\u0647 10\u062a\u0627\u06cc\u06cc"
},
"2":{
"id":3,
"name":"\u0639\u062f\u062f 10\u062a\u0627\u06cc\u06cc"
},
"5":{
"id":6,
"name":"\u0639\u062f\u062f 1000\u062a\u0627\u06cc\u06cc"
},
"6":{
"id":7,
"name":"\u06a9\u06cc\u0644\u0648\u06af\u0631\u0645"
}
}'
声明:
SELECT Units.*
FROM OPENJSON(REPLACE(@Json, N'\u', N'\u')) AS i
CROSS APPLY OPENJSON(i.[value]) WITH (
[Id] INT '$.id',
[Name] NVARCHAR(MAX) '$.name'
) AS Units
结果:
Id Name
1 تن
2 بسته 10تایی
3 عدد 10تایی
6 عدد 1000تایی
7 کیلوگرم