Redshift COPY命令导入含西语字符CSV文件乱码报错如何解决?
问题原因分析
- 首次执行COPY报错:Redshift COPY命令未指定编码时,默认会使用
LATIN1(单字节编码)解析文件,你的CSV是UTF-8编码时,ó这类多字节字符会被拆成多个乱码单字符,导致实际读取的字符数/字节数超出DDL定义的字段长度。 - 切换UTF16后报错:你第一次修改COPY参数为UTF16时,S3上的CSV还是UTF-8编码,编码不匹配导致字节序列解析失败;后续修改导出编码为UTF16仍报错,大概率是导出的UTF16字节序(大端/小端)和Redshift默认识别的UTF16字节序不匹配,且缺少BOM标识。
解决方案(优先推荐UTF-8全链路配置,兼容性更高)
方案1:全链路使用UTF-8编码
- 调整pandas导出配置,使用UTF-8编码:
csv = df.to_csv(index=False, header=True, quoting=csv_set.QUOTE_ALL, sep=",", encoding="utf-8")
- 调整Redshift COPY语句,显式指定UTF-8编码:
COPY schema.table FROM 's3://path/file.csv' IAM_ROLE 'arn' DELIMITER ',' IGNOREHEADER 1 FORMAT AS CSV QUOTE AS '"' ENCODING AS UTF8;
- 调整表字段长度定义:Redshift默认
VARCHAR(n)的n代表字节数,camión的UTF-8编码占7字节(5个单字节字符+1个双字节的ó),如果你的字段定义为VARCHAR(6)就会溢出,两种修复方式:- 直接调大字节长度,比如改为
VARCHAR(10) - 显式指定按字符计数,改为
VARCHAR(6 CHAR),不受多字节字符影响
- 直接调大字节长度,比如改为
方案2:坚持使用UTF-16编码的修复方式
- 导出时显式指定带BOM的UTF-16编码,匹配Redshift的解析规则:
csv = df.to_csv(index=False, header=True, quoting=csv_set.QUOTE_ALL, sep=",", encoding="utf-16-sig")
- COPY语句显式指定对应字节序的编码,避免自动识别错误:
COPY schema.table FROM 's3://path/file.csv' IAM_ROLE 'arn' DELIMITER ',' IGNOREHEADER 1 FORMAT AS CSV QUOTE AS '"' ENCODING AS UTF16; -- 如果还是报错可尝试替换为UTF16LE/UTF16BE匹配导出字节序
额外检查项
- 确认上传到S3的CSV是最新导出的文件,避免使用旧版本文件测试
- 确认CSV文件没有损坏、未被传输工具自动转码
内容的提问来源于stack exchange,提问作者mrc
相关产品推荐
相关产品推荐

