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

Redshift COPY 命令无法从 S3 加载数据

将批量数据从 s3 加载到 redshift

如何从一个账户访问 s3 存储桶中的数据以在另一个账户中使用 redshift 处理数据?

尝试加载 Redshift 样本,从 S3 复制时拒绝访问

使用多个清单文件从 S3 加载到 Redshift?