Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在JSON内将unicode转换为中文字符?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 在JSON内将unicode转换为中文字符?

Sql 在JSON内将unicode转换为中文字符?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在sql server 2008数据库中有一些数据是JSON格式的,使用unicode,如下所示: {"PCode":"999999","Code":"123","effect":"\u4e2d\u6587\u5b57\u6e2c\u8a66"} \u4e2d\u6587\u5b57\u6e2c\u8a66是汉字,我如何用汉字重设数据?有更好的做法吗 DECLARE @Te

我在sql server 2008数据库中有一些数据是JSON格式的,使用unicode,如下所示:

{"PCode":"999999","Code":"123","effect":"\u4e2d\u6587\u5b57\u6e2c\u8a66"}
\u4e2d\u6587\u5b57\u6e2c\u8a66是汉字,我如何用汉字重设数据?

有更好的做法吗

DECLARE @Text NVARCHAR(MAX)
DECLARE @stringToSplit NVARCHAR(MAX)
DECLARE @returnList TABLE ([Name] [nvarchar] (500))

set @stringToSplit = '\u4e2d\u6587\u5b57\u6e2c\u8a66'

 DECLARE @name NVARCHAR(255)
 DECLARE @pos INT

 WHILE CHARINDEX('\u', @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX('\u', @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  IF @name <> ''
  BEGIN
  INSERT INTO @returnList 
  SELECT NCHAR( CONVERT(INT, CONVERT(VARBINARY,@name, 2) ) )
  END

  SELECT @stringToSplit = SUBSTRING(SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos),2,LEN(@stringToSplit))
 END

 INSERT INTO @returnList
 SELECT NCHAR( CONVERT(INT, CONVERT(VARBINARY,@stringToSplit, 2) ) )

 select * from @returnList
还有更好的练习吗

DECLARE @Text NVARCHAR(MAX)
DECLARE @stringToSplit NVARCHAR(MAX)
DECLARE @returnList TABLE ([Name] [nvarchar] (500))

set @stringToSplit = '\u4e2d\u6587\u5b57\u6e2c\u8a66'

 DECLARE @name NVARCHAR(255)
 DECLARE @pos INT

 WHILE CHARINDEX('\u', @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX('\u', @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  IF @name <> ''
  BEGIN
  INSERT INTO @returnList 
  SELECT NCHAR( CONVERT(INT, CONVERT(VARBINARY,@name, 2) ) )
  END

  SELECT @stringToSplit = SUBSTRING(SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos),2,LEN(@stringToSplit))
 END

 INSERT INTO @returnList
 SELECT NCHAR( CONVERT(INT, CONVERT(VARBINARY,@stringToSplit, 2) ) )

 select * from @returnList
答复:

似乎您使用的SQLServer2008不支持JSON,因此一种可能的解决方法是将unicode序列解析为XML。请注意,XML不使用\u表示法,因此需要使用XML字符引用&x[0-9a-fA-F];转换此JSON文本:

T-SQL:

DECLARE @text nvarchar(max)
SET @text = N'\u4e2d\u6587\u5b57\u6e2c\u8a66'

DECLARE @xml xml
SET @xml = N'<x>' + STUFF(REPLACE(@text, N'\u', N';&#x'), 1, 1, N'') + N';</x>'
SELECT @xml.value('(/x)[1]', 'nvarchar(max)') AS [ChineseText]
注意,从SQLServer2016,您可以使用JSON_值轻松解析JSON

更新:

如果JSON包含其他字符,则需要使用XML和\u作为分隔符拆分JSON内容:

DECLARE @text nvarchar(max)
SET @text = N'\u4e2deng\u6587eng\u5b57234\u6e2c\u8a66'

DECLARE @xml xml
SET @xml = CONCAT(STUFF(REPLACE(@text, N'\u', N'</x><x>'), 1, 4, N''), N'</x>')
SELECT 
   CONVERT(xml, N'<x>&#x' + LEFT(t.value('.', 'nvarchar(max)'), 4) + N';</x>').value('(/x)[1]', 'nvarchar(max)'), 
   STUFF(t.value('.', 'nvarchar(max)'), 1, 4, N'')
FROM @xml.nodes('/x') AS x(t)
FOR XML PATH('')
答复:

似乎您使用的SQLServer2008不支持JSON,因此一种可能的解决方法是将unicode序列解析为XML。请注意,XML不使用\u表示法,因此需要使用XML字符引用&x[0-9a-fA-F];转换此JSON文本:

T-SQL:

DECLARE @text nvarchar(max)
SET @text = N'\u4e2d\u6587\u5b57\u6e2c\u8a66'

DECLARE @xml xml
SET @xml = N'<x>' + STUFF(REPLACE(@text, N'\u', N';&#x'), 1, 1, N'') + N';</x>'
SELECT @xml.value('(/x)[1]', 'nvarchar(max)') AS [ChineseText]
注意,从SQLServer2016,您可以使用JSON_值轻松解析JSON

更新:

如果JSON包含其他字符,则需要使用XML和\u作为分隔符拆分JSON内容:

DECLARE @text nvarchar(max)
SET @text = N'\u4e2deng\u6587eng\u5b57234\u6e2c\u8a66'

DECLARE @xml xml
SET @xml = CONCAT(STUFF(REPLACE(@text, N'\u', N'</x><x>'), 1, 4, N''), N'</x>')
SELECT 
   CONVERT(xml, N'<x>&#x' + LEFT(t.value('.', 'nvarchar(max)'), 4) + N';</x>').value('(/x)[1]', 'nvarchar(max)'), 
   STUFF(t.value('.', 'nvarchar(max)'), 1, 4, N'')
FROM @xml.nodes('/x') AS x(t)
FOR XML PATH('')

根据问题指南,请说明您尝试了什么,并告诉我们您在本网站或其他网站上找到了什么,以及为什么它不能满足您的需要。一旦汉字转换为十六进制,您就无法将其转换回去。您的列应该支持unicode。我认为您使用的是varchar来存储数据,而不是Nvarchar。列数据类型和SQL Server版本是什么?通常OPENJSON调用就足够了。@DaleK我已经给出了答案tried@hkguile除非你确实在回答自己的问题,否则你需要将其添加到问题中并删除答案。根据问题指南,请展示您的尝试,并告诉我们您在本网站或其他网站上找到了什么,以及为什么它不能满足您的需要。一旦汉字转换为十六进制,您就无法将其转换回。您的列应该支持unicode。我认为您使用的是varchar来存储数据,而不是Nvarchar。列数据类型和SQL Server版本是什么?通常OPENJSON调用就足够了。@DaleK我已经给出了答案tried@hkguile除非你真的在回答你自己的问题,否则你需要把它加到你的问题中,然后删除答案。看起来我没有concatfuntion@hkguile,您可以使用+串联运算符。但如果字符串中有数字/eng,则仍然需要手动输入,例如\u4e2deng\u6587eng\u5b57234\u6e2c\u8a66回答正确,我这边有+1!好像我没有海螺funtion@hkguile,您可以使用+串联运算符。但如果字符串中有数字/eng,则仍然需要手动输入,例如\u4e2deng\u6587eng\u5b57234\u6e2c\u8a66回答正确,+1来自我这边!