如何将CP 1049编码字符正确解码为目标字符串?
如何在SQL Server中正确解码CP 1049编码的字符串
你的问题出在char()函数的使用逻辑上:char(0xEA)这类调用会按照数据库默认代码页(比如常见的CP1251)解析十六进制值,导致字符映射错误,后续再指定排序规则也无法修正已经错了的字符。
正确解法:直接基于CP 1049字节序列转换
将CP 1049的十六进制字节以VARBINARY形式传入,再通过COLLATE指定对应编码的排序规则,让SQL Server按CP 1049规则解析字节:
declare @out table (id int not null identity, string varchar(128)) insert into @out(string) select cast(0xEAe0F6e0EFe8 as varchar(6)) collate Cyrillic_General_CI_AS select * from @out GO
补充说明
0xEAe0F6e0EFe8是你提供的CP 1049编码字节的十六进制形式(对应\''ea\''e0\''f6\''e0\''ef\''e8去掉转义后的字节)。Cyrillic_General_CI_AS排序规则基于CP 1049代码页,能正确映射这些字节到对应的西里尔字符,最终得到预期的кацапи。
替代方案(逐字符映射Unicode)
如果需要手动指定Unicode码点,也可以直接用NCHAR拼接(适合短字符串):
select NCHAR(0x043A) + NCHAR(0x0430) + NCHAR(0x0446) + NCHAR(0x0430) + NCHAR(0x043F) + NCHAR(0x0438) as decoded_string
内容的提问来源于stack exchange,提问作者ZedZip
相关产品推荐
相关产品推荐

