Redshift 复制语句丢失西班牙字符

Redshift copy statement losing spanish characters

我有一个 csv 文件,其中一列包含以下值:

Some words: camión, coche, moto                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

复制语句为:

COPY schema.table
FROM 's3://path/file.csv'
IAM_ROLE 'arn'
delimiter ',' IGNOREHEADER 1 FORMAT AS CSV QUOTE AS '"' ;

它失败了,因为它将单词 camión 替换为 cami..n:

Some words: cami..n, coche, moto     

所以,它超过了 DDL 定义的长度。

然后我尝试更改 copy 中的 encoding:

COPY schema.table
FROM 's3://path/file.csv'
IAM_ROLE 'arn'
delimiter ',' IGNOREHEADER 1 ENCODING AS UTF16 FORMAT AS CSV QUOTE AS '"' ;

然后它引发:. Bad UTF16 hex sequence: 2255736572222C2252616E6B696E6720 6E616D65222C2254797065222C224D6F

有什么我遗漏的吗?在尝试使用其他编码时,我还更改了 csv to utf-16 中的编码:

csv = df.to_csv(index=False, header=True, quoting=csv_set.QUOTE_ALL, sep=",",
                    encoding="utf-16")

DDL 长度的问题是 Redshift 将 varchars 存储在多字节 UTF8 中,对于非 ascii 字符,它在 varchar 长度中占用超过一个字节。在这些情况下,函数 octet_length() 可用于查找比字符长度长的字符串的字节长度。在处理非 ascii 字符串时,需要调整 DDL 以考虑这些额外的字节。

源文件看起来也是 UTF8 格式,因此无法使用 UTF16 编码读取。