从MySQL加载Unicode数据到Redshift时出现“坏的UTF8十六进制序列”错误
我正在尝试用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'