You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原理

  1. 先将Windows1251编码的nazva列转换为对应二进制数据
  2. 再使用代码页65001(UTF-8的代码页)将二进制数据转换为UTF-8编码的字符串,避免乱码

内容的提问来源于stack exchange,提问作者Юрій

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:00:46