Python mysqldump中奇怪的十六进制字符行为

Python mysqldump中奇怪的十六进制字符行为,python,mysql,Python,Mysql,我有一个(令人沮丧的)谜团需要帮助解决。我有一个MySQL表,其中有一列存储URL,特别是last.fm上的跟踪URL。我想我一定要以转义的html格式存储它们(例如,“ünloco”变成“'%C3%BCnloco”),因为我使用的是拉丁语排序规则(不是utf-8),但有些奇怪的事情正在发生 我使用mysqldump备份了该表,截断了该表,然后尝试使用标准的“加载数据填充”语法重新导入相同的数据 但在读取约300k的约4000万行后,它会停止(这不是一个行终止问题…已经检查过)。没有错误,没有警

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

我使用mysqldump备份了该表,截断了该表,然后尝试使用标准的“加载数据填充”语法重新导入相同的数据

但在读取约300k的约4000万行后,它会停止(这不是一个行终止问题…已经检查过)。没有错误,没有警告……好像MySQL认为文件比实际文件短

将该文件读入Python后,发现在一行中包含十六进制字符(例如.\xa0)时失败。也就是说,它将读取所有行,直到到达该行为止。我通过删除该行并重试来验证这是问题所在,在该行上加载数据直到下一行使用十六进制字符,然后停止

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

我是否必须手动编辑转储的文本文件并删除/编辑这些行,或者是否有方法使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'
(我假设\xa0是文件中的一个字节,并且您在Windows上。)

以二进制模式打开

file = open(fname, 'rb')
否则,它假定为ASCII,并且可以在非ASCII字符(\x80或更高)上中断

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


在二进制模式下,您不应该使用
next
(将文件用作iterable)、
readline
readlines
,因为它们查找ASCII。改为使用。

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

for line in open(filename):
    try:
        line.decode('ascii')
    except:
        print line
基本上,我试着用ascii码解码这行,如果不行,我就打印这行。这就引出了相关的行,并允许我编辑它们,以便MySQL能够正确地读取它们


当然,这并没有说明这些值最初是如何出现的,但至少让我解决了这个问题。

另请参阅并追踪\xa0的来源或使用,因为它可能很重要。也许你在存储特殊的引号之类的东西。在挖掘了一些旧的数据库备份之后,问题肯定是一些特殊字符以某种方式出现在了数据库中(我仍然不知道如何)。我可以修复它们,但仍然需要一种方法来识别哪些行包含这样的字符…这实际上没有帮助…像这样读取文件会提供与我对上述问题的编辑相同的结果。您可能使用的是readline,它不理解非ASCII。