PostgreSQL中convert_to函数转WIN1251编码报错问题咨询
解决PostgreSQL convert_to转WIN1251时的编码报错问题
首先明确:报错里的字节序列0xc2 0x98对应的UTF-8字符是™(商标符号),而非西里尔字母И(И的UTF-8编码是0xD0 0x98),这说明你的XML字符串存在编码混淆,或者包含WIN1251编码不支持的字符。
以下是几种可行的解决方法:
先确认真实字符
执行以下SQL查看报错字节对应的实际字符:SELECT convert_from('\xc2\x98'::bytea, 'UTF8');结果大概率是
™,如果确实是И,说明XML本身的编码就不是正确的UTF-8,需要先修正原始数据的编码。替换不兼容字符
如果XML里包含WIN1251不支持的字符(比如™),可以将其替换为WIN1251支持的等效文本:SELECT convert_to(replace(_xml, '™', '(TM)'), 'WIN1251');过滤不兼容字符
直接删除无法转换的字符,以™为例(其Unicode为U+2122):SELECT convert_to(translate(_xml, unistr('\u2122'), ''), 'WIN1251');修正XML编码(如果原始编码错误)
如果XML原本是WIN1251编码,但被错误地以UTF-8存储,先转换为正确的字节序列再处理:SELECT convert_to(convert_from(_xml::bytea, 'WIN1251'), 'WIN1251');使用iconv扩展(需权限)
若有权限安装pg_iconv扩展,可以用iconv指定错误处理策略(比如忽略错误):-- 先安装扩展(仅需执行一次) CREATE EXTENSION IF NOT EXISTS pg_iconv; -- 转换时忽略无法转换的字符 SELECT iconv(_xml::text, 'UTF8', 'WIN1251//IGNORE');
内容的提问来源于stack exchange,提问作者destroyer86
相关产品推荐
相关产品推荐

