我有一个(令人沮丧的)谜团需要帮助解决。我有一个 MySQL 表,其中有一列存储 URL,特别是在 last.fm 上跟踪的 URL。我认为我确保以转义的 html 格式存储它们(例如“ünloco”变成“'%C3%BCnloco”),因为我使用的是拉丁排序规则(不是 utf-8),但有些奇怪的事情正在发生。
我用 mysqldump 备份了表,截断了表,然后尝试使用标准的“load data infile”语法重新导入相同的数据。
但它会在读取 ~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
(将文件用作可迭代对象)、readline
或readlines
,因为它们寻找 ASCII。使用 read
相反。
关于python - mysqldump 的奇怪十六进制字符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21521565/