Sybase/SAP SQL中如何将CP1251字段转为UTF8?FOR JSON乱码解决
解决Windows1251数据库下FOR JSON输出UTF8乱码问题
这种乱码是因为Windows1251编码的西里尔字符被错误当作UTF-8解析导致的编码不匹配问题,可以通过SQL层面转换指定列的编码来解决,以下是针对不同SQL Server版本的解决方案:
方案一:SQL Server 2019及以上版本(支持UTF8排序规则)
直接为指定列应用UTF8排序规则,再输出JSON:
select 1 as "tag", null as "parent", "period" as "!1!period", CONVERT(varchar(max), nazva COLLATE Cyrillic_General_100_CI_AS_SC_UTF8) as "!1!nazva", "DogovorNumber" as "!1!DogovorNumber" from "dba"."Myk_Orgs_for_1C"(@cmonth = 3,@cyear = 2022) order by 3 asc for json explicit
原理
Cyrillic_General_100_CI_AS_SC_UTF8是SQL Server支持的UTF8排序规则,通过COLLATE子句将nazva列的编码转换为UTF-8,再用CONVERT确保输出为UTF-8编码的字符串,FOR JSON输出时就能正确解析西里尔字符。
方案二:SQL Server 2017及以下版本(无原生UTF8排序规则支持)
通过二进制转换间接实现编码转换:
select 1 as "tag", null as "parent", "period" as "!1!period", CONVERT(varchar(max), CONVERT(varbinary(max), nazva COLLATE Cyrillic_General_CS_AS), 65001) as "!1!nazva", "DogovorNumber" as "!1!DogovorNumber" from "dba"."Myk_Orgs_for_1C"(@cmonth = 3,@cyear = 2022) order by 3 asc for json explicit
原理
- 先将Windows1251编码的
nazva列转换为对应二进制数据 - 再使用代码页
65001(UTF-8的代码页)将二进制数据转换为UTF-8编码的字符串,避免乱码
内容的提问来源于stack exchange,提问作者Юрій
相关产品推荐
相关产品推荐

