UnicodeDecodeError: код 'utf-8' c не может декодировать байт 0xe1 в позиции 6: недопустимый байт продолжения - PullRequest
0 голосов
/ 13 июля 2020

Итак, это началось, когда я обновил свой монетный двор 19 до 20. Полная ошибка:

Traceback (most recent call last):
  File "/home/notification/views.py", line 206, in get
    .select_related("history__definition")
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/django/db/models/query.py", line 653, in first
    for obj in (self if self.ordered else self.order_by('pk'))[:1]:
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/django/db/models/query.py", line 274, in __iter__
    self._fetch_all()
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/django/db/models/query.py", line 1242, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/django/db/models/query.py", line 55, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1133, in execute_sql
    cursor.execute(sql, params)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/debug_toolbar/panels/sql/tracking.py", line 192, in execute
    return self._record(self.cursor.execute, sql, params)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/debug_toolbar/panels/sql/tracking.py", line 126, in _record
    return method(sql, params)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/django/db/backends/utils.py", line 99, in execute
    return super().execute(sql, params)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/sentry_sdk/integrations/django/__init__.py", line 469, in execute
    return real_execute(self, sql, params)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 73, in execute
    return self.cursor.execute(query, args)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/MySQLdb/cursors.py", line 206, in execute
    res = self._query(query)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/MySQLdb/cursors.py", line 321, in _query
    self._post_get_result()
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/MySQLdb/cursors.py", line 355, in _post_get_result
    self._rows = self._fetch_row(0)
  File "/home/linuxbrew/.linuxbrew/opt/python/lib/python3.7/site-packages/MySQLdb/cursors.py", line 328, in _fetch_row
    return self._result.fetch_row(size, self._fetch_type)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe3 in position 11: invalid continuation byte

База данных MySQL и настроена с помощью utf8mb4

mysql> SHOW VARIABLES LIKE 'char%';
Variable_name           |Value                     |
------------------------|--------------------------|
character_set_client    |utf8mb4                   |
character_set_connection|utf8mb4                   |
character_set_database  |utf8mb4                   |
character_set_filesystem|binary                    |
character_set_results   |                          |
character_set_server    |latin1                    |
character_set_system    |utf8                      |
character_sets_dir      |c:\mariadb\share\charsets\|

Строка который выдает эту ошибку, вот эта, и глядя на шестнадцатеричный код, все в порядке.

description                                 |hex(description)                                                                          |
--------------------------------------------|------------------------------------------------------------------------------------------|
Necessária para as partidas na 'batalha'|4E6563657373C3A17269612070617261206173207061727469646173206E612027626174616C6861206A6F7927|

á = C3 A1

Кто-то помещает 0xe1, который принадлежит cp1252. Я углубился в отладку, но похоже, что преобразование происходит в библиотеке MysqlDB.

Подробнее о среде:

pip3 list | grep -i mysql
mysql-connector-python                8.0.20   
mysql-connector-python-rf             2.2.2    
mysqlclient                           2.0.1    
PyMySQL                               0.9.3

1 Ответ

2 голосов
/ 15 июля 2020

Настройки character_set_%, которые у вас есть, кажутся вам странными:

| character_set_client     | latin7          | names
| character_set_connection | latin7          | names
| character_set_database   | utf8mb4         | ?
| character_set_filesystem | binary          | hands-off
| character_set_results    | latin7          | names
| character_set_server     | utf8mb4         | ?
| character_set_system     | utf8            | hands-off

Я разделил их на 3 группы:

  • «отключение» - файловая система и система не следует изменять значение по умолчанию, иначе внутренние вещи могут сломаться.
  • «имена» - SET NAMES latin7 - это, например, как вы указываете, что клиенты используют latin7 кодирование. Общий переход от старого по умолчанию latin1 к будущему стандарту utf8mb4. (Я использовал latin7, чтобы выделить его.
  • "?" - Непонятно, какое влияние эти два имеют. Я рекомендую оставить их вместе со значениями из установки, что, вероятно, составляет utf8mb4 (для оба) в последних версиях MySQL / MariaDB.

В 5.7.6 GLOBAL character_set_database и collation_database системные переменные устарели; версия SESSION стала доступной только для чтения (устарело)

Из журнала изменений 8.0.1:

Важное изменение: набор символов по умолчанию изменен с latin1 на utf8mb4. Затронуты следующие системные переменные:

  • Значение по умолчанию для Системные переменные character_set_server и character_set_database изменились с latin1 на utf8mb4.

  • Значение по умолчанию для системных переменных collation_server и collation_database изменилось с latin1_swedish_ci на utf8mb4_0900_ai_ci.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...