python - mysqldump 的奇怪十六进制字符行为

标签 python mysql

我有一个(令人沮丧的)谜团需要帮助解决。我有一个 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(将文件用作可迭代对象)、readlinereadlines,因为它们寻找 ASCII。使用 read相反。

关于python - mysqldump 的奇怪十六进制字符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21521565/

相关文章:

python - numpy 中所有可能的列乘法?

php - CodeIgniter SQL 查询缺少列

PHP if else while (with mysql) 语句不工作

javascript - 如何控制 Bootstrap 表上的按钮操作

python - Django 自定义默认组模型

python - django webapp 中的自定义 TCP/IP 服务器?

python - Celery update_state 内部类方法

python - 在形状不兼容的张量上重新调用

php - 按 php 和 mysql 表分类

mysql - Microsoft SQL Server 相当于 MySQL REGEXP