【问题标题】:Loading Unicode data from mysql to Redshift fails with "Bad UTF8 hex sequences"将 Unicode 数据从 mysql 加载到 Redshift 失败并显示“错误的 UTF8 十六进制序列”
【发布时间】:2014-03-07 19:48:26
【问题描述】:

我正在尝试使用 Python 创建一个从 MySQL 到 Redshift 的简单表复制器。我这样做的方式是在 MySQL 中查询表并使用 Python (2.7) 将输出写入 CSV,然后将它们发送到 S3 并将它们复制到各自的目标表中。

我遇到了 Unicode 字符的问题。具体来说,我收到以下错误:

String contains invalid or unsupported UTF8 codepoints. Bad UTF8 hex sequence: e9 20 50 (error 4)

我的问题是这是 python 问题,还是 S3/Redshift 问题。这是我在 python 中所做的:

import unicodecsv as csv

csv_writer = csv.writer(dest, encoding='utf-8')
for index,line in enumerate(a):
    if index == len(a)/2:
        file_ext+=1
        if dest: dest.close()
        dest = open(config['data_dir'] + directory + '/' + table_name + '.txt.' + str(file_ext), 'wb')
        csv_writer = csv.writer(dest, encoding='utf-8')
    csv_writer.writerow(line)

所以据我了解,Python 正在正确地编写内容。事实上,如果我在 VI 中打开 CSV,我可以看到: "Fjällräven Canvas Black Kanken 15\ Laptop Bag""" 所以这对我来说是正确的(\ 和额外的“是来自源的垃圾)。但是,如果我对 csv 运行文件,我会得到:ASCII text, with very long lines, with CRLF line terminators。在将文件移动到 S3 并运行副本后,我结束了出现上述 Redshift COPY 错误。

所以,回到问题:我怀疑这与 file 的编码方式有关,而不是其中的内容,但我无法找到通过我的搜索得到任何确定的信息。有没有人遇到过这个问题,他们找到了解决方案吗?感谢您的帮助

【问题讨论】:

  • 我的猜测是 line 是一个 str 数据对象,其中包含(当然是非 unicode)非 utf-8 编码的编码文本,当您尝试将其写入您的csv_writer 它无法将该数据从 utf-8 解码为 un​​icode,因为它不是 utf-8。您应该找出line 的编码,并且应该使用它而不是'utf-8' 作为编码参数。如果您使用的是 Windows,那么它可能是“windows-12XX”编码之一,具体取决于您的语言环境。
  • 你拼错了 Kånken (-:

标签: python utf-8 amazon-redshift


【解决方案1】:

结果我上面显示的一切都很好,但是 MySQL 没有导出 UTF-8 字符。通过在我的连接字符串中添加以下两行来修复它:

'use_unicode' : True,
'charset':'utf8'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2017-04-20
    • 2010-10-25
    • 2020-02-06
    • 2022-12-13
    • 2014-10-12
    • 2018-01-22
    相关资源
    最近更新 更多