【问题标题】:mySQL unicode decode error for emojis when the Django queryset is converted to a list将 Django 查询集转换为列表时,表情符号的 mySQL unicode 解码错误
【发布时间】:2021-01-18 14:35:16
【问题描述】:

我使用的是 Django 1.11、python 3.6 和 mysqlclient 1.4.6。我需要将 Django 查询集转换为列表。查询集中的对象有一个带有 unicode emoji 值的字段。 (参见:field=u'✅ This is the field value')mySQL 中的特定表和字段使用utf8mb4_unicode_ci 编码。

当我运行qs_list = list(qs) 时,MySQL 会抛出一个 Unicode 错误,我认为这是由评估查询集时字段中的表情符号引起的。

文件编码:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

查询集:

qs = Fake.objects.filter(..)
qs_list = list(qs)

错误:

<class 'UnicodeDecodeError'>
Exception: 'utf-8' codec can't decode byte 0xed in position 11: invalid continuation byte

File "/home/mysite/lib/python3.6/site-packages/django/db/models/query.py", line 250, in __iter__
self._fetch_all()
File "/home/mysite/lib/python3.6/site-packages/django/db/models/query.py", line 1121, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "/home/mysite/lib/python3.6/site-packages/django/db/models/query.py", line 53, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
File "/home/mysite/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 899, in execute_sql
raise original_exception
File "/home/mysite/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 889, in execute_sql
cursor.execute(sql, params)
File "/home/mysite/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/mysite/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 101, in execute
return self.cursor.execute(query, args)
File "/home/mysite/lib/python3.6/site-packages/MySQLdb/cursors.py", line 209, in execute
res = self._query(query)
File "/home/mysite/lib/python3.6/site-packages/MySQLdb/cursors.py", line 317, in _query
self._post_get_result()
File "/home/mysite/lib/python3.6/site-packages/MySQLdb/cursors.py", line 352, in _post_get_result
self._rows = self._fetch_row(0)
File "/home/mysite/lib/python3.6/site-packages/MySQLdb/cursors.py", line 325, in _fetch_row
return self._result.fetch_row(size, self._fetch_type)

是否有一个简单的解决方案或解决方法?如何在不评估查询集的情况下获取查询集中的对象列表?

【问题讨论】:

  • 要么告诉它您的数据是 latin1,要么实际提供它的 utf-8 编码数据。

标签: mysql python-3.x django unicode mysql-python


【解决方案1】:

这很可能与编码有关,您需要按照this article 中的建议检查其他类型的编码

关于对象列表 - 尝试迭代结果以获取(例如)每个名称并将值存储在列表中:

qs = Fake.objects.filter(..)
qs_list = [x.name for x in qs]

其中 'name' 是您需要迭代的模型字段。

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 2015-01-15
    • 1970-01-01
    • 2021-11-08
    • 2018-07-19
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    相关资源
    最近更新 更多