我们在S3中有一个文件,它通过COPY
命令加载到Redshift中。导入失败,因为VARCHAR(20)
值包含Ä
,该值在复制命令期间被转换为..
,现在对于20个字符来说太长了。
我已验证S3中的数据是否正确,但COPY
在导入期间无法理解UTF-8字符。有人找到了解决方案吗?
答案 0 :(得分:15)
varchar
列的字节长度只需要更大。
varchar
数据类型支持多字节字符(UTF-8),但提供的长度为 bytes , NOT 字符
AWS documentation for Multibyte Character Load Errors声明如下:
VARCHAR
列接受多字节UTF-8字符,最多四个字节。
因此,如果您希望允许字符Ä
,则需要为此字符允许2个字节,而不是1个字节。
AWS documentation for VARCHAR or CHARACTER VARYING声明如下:
...所以
VARCHAR(120)
列最多包含120个单字节字符,60个双字节字符,40个三字节字符或30个四字节字符。
对于UTF-8字符及其字节长度的列表,这是一个很好的参考: Complete Character List for UTF-8
可以找到Unicode字符“带有DIAERESIS的LATIN CAPITAL LETTER A”(U + 00C4)的详细信息here。
答案 1 :(得分:2)
请查看以下链接
http://docs.aws.amazon.com/redshift/latest/dg/multi-byte-character-load-errors.html
您应该在复制命令中使用 ACCEPTINVCHARS 。详情
http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html#acceptinvchars
答案 2 :(得分:1)
在复制命令中使用“ACCEPTINVCHARS ESCAPE”解决了我们的问题,并进行了少量数据更改。
答案 3 :(得分:0)
我有类似的经历,当将mysqldump数据加载到我们的Redshift集群中时,某些像Ä
这样的字符没有被正确复制。这是因为mysqldump的编码是latin1
,它是mysql的默认字符集。最好首先检查COPY文件的字符编码。如果文件的编码不是UTF-8,则必须对文件进行编码。
答案 4 :(得分:0)
您需要增加varchar列的大小。检查stl_load_errors表,查看失败的行的实际字段值长度是多少,并相应地增加大小。 编辑:刚意识到这是一个很老的帖子,无论如何如果有人需要它。