如何在PostgreSQL中读取并导入UTF-16编码的大量XML文件?
解决PostgreSQL读取UTF-16编码XML文件的错误
问题原因
你遇到的ERROR: invalid byte sequence for encoding "UTF8": 0xff错误,是因为XML文件采用UTF-16编码(包含开头的BOM字节0xff),但你在convert_from中错误指定了源编码为UTF8,导致PostgreSQL尝试用UTF-8规则解析UTF-16字节流,触发编码不兼容错误。
正确解决方案
根据XML文件的UTF-16类型(带BOM/无BOM、LE/BE),修改convert_from的编码参数即可:
1. 带BOM的UTF-16文件(最常见,Windows生成的UTF-16文件通常带BOM)
直接使用UTF16作为编码参数,PostgreSQL会自动识别BOM并处理字节序:
SELECT XMLPARSE(DOCUMENT convert_from( pg_read_binary_file('C:/Program Files/PostgreSQL/10/data/xmls/test'), 'UTF16'));
2. 无BOM的UTF-16LE文件
如果文件是小端字节序且无BOM,指定UTF-16LE:
SELECT XMLPARSE(DOCUMENT convert_from( pg_read_binary_file('C:/Program Files/PostgreSQL/10/data/xmls/test'), 'UTF-16LE'));
3. 无BOM的UTF-16BE文件
如果文件是大端字节序且无BOM,指定UTF-16BE:
SELECT XMLPARSE(DOCUMENT convert_from( pg_read_binary_file('C:/Program Files/PostgreSQL/10/data/xmls/test'), 'UTF-16BE'));
批量处理建议
如果有大量XML文件,建议先批量将UTF-16文件转换为UTF-8格式后再导入,避免逐个处理编码差异。可以用iconv工具完成批量转换:
# 遍历当前目录下所有xml文件,转换为UTF-8并添加_utf8后缀 for file in *.xml; do iconv -f UTF-16 -t UTF-8 "$file" > "${file%.xml}_utf8.xml" done
内容的提问来源于stack exchange,提问作者Scorpion
相关产品推荐
相关产品推荐

