首页 > 解决方案 > Sql Server OPENJSON 返回 unicode 字符串

问题描述

我对 SQL Server 和 JSON 有疑问:/

有很多来自远程数据库的 JSON 字符串(我只有读取权限)。问题是它们都被解析成 unicodes 而我不知道如何把它们变成 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。我这样做是为了将数据提取到表中:

SELECT Units.*
FROM OPENJSON(@Json) AS i
CROSS APPLY OPENJSON(i.[value]) WITH (
   [Id] INT '$.id',
   [Name] NVARCHAR(MAX) '$.name'
) AS Units

然后它会显示如下结果:

但我需要这样的结果:

标签: jsonsql-serverunicodeutf-8

解决方案


来自 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   کیلوگرم

推荐阅读