S3 -> Redshift 无法处理 UTF8
Posted
技术标签:
【中文标题】S3 -> Redshift 无法处理 UTF8【英文标题】:S3 -> Redshift cannot handle UTF8 【发布时间】:2014-12-22 23:59:39 【问题描述】:我们在 S3 中有一个文件,它通过 COPY
命令加载到 Redshift。导入失败,因为 VARCHAR(20)
值包含 Ä
,该值在复制命令期间被转换为 ..
,现在对于 20 个字符来说太长了。
我已验证 S3 中的数据是正确的,但 COPY
命令在导入过程中不理解 UTF-8 字符。有没有人找到解决方案?
【问题讨论】:
【参考方案1】:tl;博士
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 字符“LATIN CAPITAL LETTER A WITH DIAERESIS”(U+00C4) 的详细信息,请参见 here。
【讨论】:
【参考方案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
【讨论】:
但是字符不是无效的。我不希望它破坏数据,我希望它正确导入。【参考方案3】:我有类似的经历,在将 mysqldump 数据加载到我们的 Redshift 集群时,没有正确复制一些像 Ä
这样的字符。这是因为mysqldump的编码是latin1
,这是mysql的默认字符集。最好先检查 COPY 文件的字符编码。如果文件的编码不是 UTF-8,则必须对文件进行编码。
【讨论】:
【参考方案4】:在复制命令中使用“ACCEPTINVCHARS ESCAPE”为我们解决了少量数据更改的问题。
【讨论】:
【参考方案5】:您需要增加 varchar 列的大小。检查 stl_load_errors 表,查看失败行的实际字段值长度是多少,并相应地增加大小。 编辑:刚刚意识到这是一个非常古老的帖子,无论如何如果有人需要它..
【讨论】:
以上是关于S3 -> Redshift 无法处理 UTF8的主要内容,如果未能解决你的问题,请参考以下文章
无法将制表符分隔的 Txt 文件从 S3 加载到 Redshift