由于mysql数据中的延续字节无效,如何捕获unicodedecodeerror

643ylb08  于 2021-06-20  发布在  Mysql
关注(0)|答案(7)|浏览(472)

我正在将数千万行的文本数据从mysql移到搜索引擎中,但无法成功处理其中一个检索到的字符串中的unicode错误。我已经尝试显式地对检索到的字符串进行编码和解码,以使python抛出unicode异常并了解问题所在。
这个异常是在我的笔记本电脑上运行了数千万行之后抛出的(叹气…),但是我无法捕捉它,跳过那一行,继续我想要的。mysql数据库中的所有文本都应该是utf-8。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 143: invalid continuation byte

下面是我使用mysql连接器/python建立的连接

cnx = mysql.connector.connect(user='root', password='<redacted>',
                          host='127.0.0.1',
                          database='bloggz',
                          charset='utf-8')

以下是数据库字符设置:

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR 
Variable_name LIKE 'collation%';
pdtvr36n

pdtvr36n1#

-------+
下面的异常处理有什么问题?注意,变量“last\u feeds\u id”也没有打印出来,但这可能只是except子句不起作用的证明。

last_feeds_id = 0
for feedsid, ts, url, bid, title, html in cursor:

  try:
    # to catch UnicodeErrors and see where the prolem lies
    # from: https://mail.python.org/pipermail/python-list/2012-July/627441.html
    # also see https://stackoverflow.com/questions/28583565/str-object-has-no-attribute-decode-python-3-error

    # feeds.URL is varchar(255) in mysql
    enc_url = url.encode(encoding = 'UTF-8',errors = 'strict')
    dec_url = enc_url.decode(encoding = 'UTF-8',errors = 'strict')

    # texts.title is varchar(600) in mysql
    enc_title = title.encode(encoding = 'UTF-8',errors = 'strict')
    dec_title = enc_title.decode(encoding = 'UTF-8',errors = 'strict')

    # texts.html is text in mysql
    enc_html = html.encode(encoding = 'UTF-8',errors = 'strict')
    dec_html = enc_html.decode(encoding = 'UTF-8',errors = 'strict')

    data = {"timestamp":ts,
            "url":dec_url,
           "bid":bid,
           "title":dec_title,
           "html":dec_html}
    es.index(index="blogposts",
            doc_type="blogpost",
            body=data)
  except UnicodeDecodeError as e:
    print("Last feeds id: {}".format(last_feeds_id))
    print(e)

  except UnicodeEncodeError as e:
    print("Last feeds id: {}".format(last_feeds_id))
    print(e)

  except UnicodeError as e:
    print("Last feeds id: {}".format(last_feeds_id))
    print(e)
i86rm4rw

i86rm4rw5#

它抱怨hex ED . 你在期待急性-i: í ? 如果是这样,那么您的文本不是utf-8编码的,而是cp1250、dec8、latin1、latin2、latin5中的一个。
你的python源代码是从


# -*- coding: utf-8 -*-

查看更多python-utf8提示
此外,请在此回顾“最佳实践”
你有 charset='utf-8' ; 我不确定,但也许应该是这样 charset='utf8' . 参考 UTF-8 这就是人们所说的角色集。mysql调用它的3字节子集 utf8 . 注意没有破折号。

vdgimpew

vdgimpew6#

-------+
|变量名称值|
+

k7fdbhmy

k7fdbhmy7#

-------+
|字符集客户机utf8|
|字符集连接utf8|
|字符集数据库utf8|
|字符集文件系统二进制|
|字符集结果utf8|
|字符集服务器utf8|
|字符集系统utf8|
|排序规则| utf8 |常规| ci|
|排序规则|数据库| utf8 |常规| ci|
|排序规则|服务器| utf8 |常规| ci|
+

相关问题