psql导入sql dump文件报UTF8编码无效字节序列0xff错误如何解决
PostgreSQL 9.6导入sql dump文件UTF8编码0xff错误修复方案
报错信息:
invalid line number: e
ERROR: invalid byte sequence for encoding "UTF8": 0xff
该错误本质是dump文件编码和PostgreSQL服务端默认的UTF8编码不匹配,0xff是常见的UTF-16编码BOM头字节,或文件中存在非UTF8编码的特殊字符,可按以下步骤修复:
- 第一步:备份原始dump文件,所有操作都在副本上执行,避免损坏唯一的原始文件
- 第二步:确认文件编码
Linux/macOS下执行file 你的dump文件路径.sql,查看输出的编码类型,常见异常编码为UTF-16 (with BOM)、UTF-8 (with BOM)、GBK、ISO-8859-1等 - 第三步:根据编码类型处理文件
- 如果是带BOM的UTF-8编码:执行
sed -i '1s/^\xef\xbb\xbf//' 你的dump文件路径.sql删除BOM头即可 - 如果是UTF-16系列编码:执行
iconv -f UTF-16 -t UTF-8//IGNORE 原始dump文件.sql > 转码后文件.sql完成编码转换 - 如果是GBK/GB2312等中文编码:执行
iconv -f GBK -t UTF-8//IGNORE 原始dump文件.sql > 转码后文件.sql完成编码转换,//IGNORE参数会自动丢弃无法转换的无效字符,避免转码中断
- 如果是带BOM的UTF-8编码:执行
- 第四步:如果转码后仍报错,定位无效字符位置
执行grep -obUaP "\xff" 你的dump文件路径.sql | head -10,输出的数字就是0xff字符出现的字节偏移量,找到对应位置手动删除无效字符即可 - 第五步:应急导入方案
若不需要保留所有字符仅需优先完成导入,可临时指定客户端编码为单字节的LATIN1绕过编码校验,执行命令:psql -d 目标数据库名 -U 用户名 -c "SET client_encoding = 'LATIN1';" -f 处理后的dump文件.sql
导入完成后再逐表校验数据,修复零散乱码内容即可
注:开头的invalid line number: e报错是dump文件头部的异常字符被psql识别为无效命令导致的,处理完编码/BOM后该报错会同步消失
内容的提问来源于stack exchange,提问作者Smith
相关产品推荐
相关产品推荐

