从MySQL加载Unicode数据到Redshift时出现“坏的UTF8十六进制序列”错误

0 投票
1 回答
1908 浏览
提问于 2025-04-17 21:21

我正在尝试用Python创建一个简单的表复制工具,把MySQL的数据复制到Redshift。我的做法是先从MySQL查询表的数据,然后用Python(2.7)把结果写成CSV文件,接着把这些CSV文件上传到S3,再从S3把数据导入到目标表中。

我遇到了一个关于Unicode字符的问题。具体来说,我收到了以下错误信息:

字符串包含无效或不支持的UTF8编码点。错误的UTF8十六进制序列:e9 20 50(错误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"""。看起来是对的(其中的\和多余的"是源文件中的杂项)。但是,如果我用file命令检查这个CSV文件,我得到的结果是:ASCII文本,行很长,使用CRLF换行符。在把文件移动到S3并运行复制操作后,我遇到了上面提到的Redshift COPY错误。

所以,回到我的问题:我怀疑这和文件的编码方式有关,而不是文件中的内容,但我在搜索中没有找到明确的答案。有没有人遇到过这个问题,并找到了解决方案?谢谢大家的帮助。

1 个回答

0

结果发现,我之前展示的所有内容都没问题,但MySQL没有正确导出UTF-8字符。这个问题通过在我的连接字符串中添加以下两行代码解决了:

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

撰写回答