Sql 在JSON内将unicode转换为中文字符?
我在sql server 2008数据库中有一些数据是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
{"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来自我这边!