mysqldump使用奇怪的十六进制字符行为

时间:2014-02-03 07:08:06

标签: python mysql

我有一个(令人沮丧的)谜团我需要帮助解决。我有一个MySQL表,其中包含一个存储URL的列,特别是last.fm上轨道的URL。我想法我确保将它们存储在他们的转义html格式中(例如“ünloco”变成“'%C3%BCnloco”),因为我正在使用拉丁语校对(不是utf-8),但是有些奇怪的事情正在发生。

我使用mysqldump备份了表,截断了表,然后尝试使用标准的“load data infile”语法重新导入相同的数据。

但是在阅读~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~没有错误,没有警告......就好像MySQL认为文件比实际更短。

在将文件读入Python之后,事实证明它在一行中有一个十六进制字符(例如\ xa0)失败了。也就是说,它会读取所有行,直到它达到那一行。我通过删除该行并再次尝试来验证这是问题,然后将数据加载到带有十六进制字符的 next 行并停止。

所以这些字符肯定是问题所在,但我不知道它们是如何在表中结束的(拉丁校对不应该不允许这样吗?)。更重要的是,我现在如何将数据恢复到数据库中?

我是否必须手动编辑转储的文本文件并删除/编辑这些行,或者有没有办法让MySQL正确读取文件?在前一种情况下,我如何有效地找到有问题的行(命令行或Python解决方案赞赏...有太多的行来手动检查)。


编辑以包含有问题的行的示例,我学到的第一个是:

for i,line in enumerate(open(filename)):
    if i==350616:
        break

print line 
350317  2       sevish  346067  \N      á       sevish/_/á

print repr(line)
'350317\t2\tsevish\t346067\t\\N\t\xa0\tsevish/_/\xa0\n'

2 个答案:

答案 0 :(得分:0)

(我假设\ xa0是文件中的单个字节,而且你在Windows上。)

以二进制模式打开。

file = open(fname, 'rb')

否则,它采用ASCII并且可以在非ASCII字符(\ x80左右等)上中断。

注意:您将从读取操作而不是字符串中获取字节数组。您可能需要使用str转换输入,这可能仍会在非ASCII上中断。

在二进制模式下,您不应使用next(将文件用作可迭代文件),readlinereadlines,因为它们会查找ASCII。请改用read

答案 1 :(得分:0)

好的,所以我终于想出了一种方法,或多或少地简单地找到哪些线路有问题:

for line in open(filename):
    try:
        line.decode('ascii')
    except:
        print line

基本上,我尝试解码ascii中的行,如果这不起作用,我打印该行。这拉出了相关的行,并允许我编辑它们,以便MySQL可以正确地读取它们。

这当然没有解决这些值如何,但至少让我解决了这个问题。