You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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编码

  1. 调整pandas导出配置,使用UTF-8编码:
csv = df.to_csv(index=False, header=True, quoting=csv_set.QUOTE_ALL, sep=",",
                    encoding="utf-8")
  1. 调整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;
  1. 调整表字段长度定义:Redshift默认VARCHAR(n)的n代表字节数,camión的UTF-8编码占7字节(5个单字节字符+1个双字节的ó),如果你的字段定义为VARCHAR(6)就会溢出,两种修复方式:
    • 直接调大字节长度,比如改为VARCHAR(10)
    • 显式指定按字符计数,改为VARCHAR(6 CHAR),不受多字节字符影响

方案2:坚持使用UTF-16编码的修复方式

  1. 导出时显式指定带BOM的UTF-16编码,匹配Redshift的解析规则:
csv = df.to_csv(index=False, header=True, quoting=csv_set.QUOTE_ALL, sep=",",
                    encoding="utf-16-sig")
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:54:03