首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UnicodeDecodeError:'utf-8‘编解码器无法解码位置为180的字节0xa0 :无效的开始字节

UnicodeDecodeError:'utf-8‘编解码器无法解码位置为180的字节0xa0 :无效的开始字节
EN

Stack Overflow用户
提问于 2021-08-29 06:46:10
回答 1查看 1.6K关注 0票数 1

我在settings.py中使用Django和下面的配置

代码语言:javascript
复制
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '-',
        'USER': '-',
        'PASSWORD': '-',
        'HOST': '-',
        'PORT': '-',
        'OPTIONS': {'charset': 'utf8mb4'}
    }
}

db服务器正在AWS RDS上运行。我有两个EC2实例,其中一个实例能够运行完全相同的代码并获取相同的数据,而在第二个EC2中,我得到了以下错误:

代码语言:javascript
复制
     return self._execute_with_wrappers(sql  params  many=False  executor=self._execute)
File "/home/ubuntu/.virtualenvs/python39/lib/python3.9/site-packages/django/db/backends/utils.py"   line 75  in _execute_with_wrappers  
     return executor(sql     params  many    context)
File "/home/ubuntu/.virtualenvs/python39/lib/python3.9/site-packages/django/db/backends/utils.py"   line 84  in _execute    
     return self.cursor.execute(sql  params)        
File "/home/ubuntu/.virtualenvs/python39/lib/python3.9/site-packages/django/db/backends/mysql/base.py"  line 73  in execute 
     return self.cursor.execute(query    args)      
File "/home/ubuntu/.virtualenvs/python39/lib/python3.9/site-packages/MySQLdb/cursors.py"    line 206     in execute 
     res = self._query(query)           
File "/home/ubuntu/.virtualenvs/python39/lib/python3.9/site-packages/MySQLdb/cursors.py"    line 321     in _query  
     self._post_get_result()            
File "/home/ubuntu/.virtualenvs/python39/lib/python3.9/site-packages/MySQLdb/cursors.py"    line 355     in _post_get_result    
self._rows = self._fetch_row(0)         
File "/home/ubuntu/.virtualenvs/python39/lib/python3.9/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 0xa0 in position 180: invalid start byte

django的html响应还显示了以下内容:

代码语言:javascript
复制
Unicode error hint
The string that could not be encoded/decoded was: \n<p>�</p>\

另外,负责抛出错误的代码片段是:

代码语言:javascript
复制
    exp = MyModel.objects.all()
    **for e in exp:** <-- this line is throwing the error
        #do something

这两台服务器上的版本:

EC2-1有:

代码语言:javascript
复制
Ubuntu 16.04.4

Django==1.11.2
mysqlclient==1.3.10
django-mysql==2.1.0

python3 --version
Python 3.5.2

mysql --version
mysql  Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using  EditLine wrapper

ec2-2-2是EC2-1的副本,并应用了更新:

代码语言:javascript
复制
Ubuntu 20.04.3

Django==3.2.6
mysqlclient==2.0.3
django-mysql==3.10.0

python3 --version
Python 3.9.5

mysql --version
mysql  Ver 14.14 Distrib 5.7.35, for Linux (x86_64) using  EditLine wrapper

此外,我的本地服务器能够很好地运行这些工具的版本:我已经在本地导入了RDS db,并使用接近prod配置的本地配置来尝试调试这个问题。

代码语言:javascript
复制
Mac OS 11.5.2
Django==3.2.6
mysqlclient==2.0.3
django-mysql==3.10.0

Python 3.9.6

mysql  Ver 8.0.25 for macos11.3 on x86_64 (Homebrew)

我该试试什么?

EN

回答 1

Stack Overflow用户

发布于 2021-10-07 18:41:27

MySQL文档连接时间错误处理描述了使用MySQL 8.0客户端库连接到带有utf8mb4字符集的MySQL 5.7服务器时出现的问题。MySQL 8.0客户端请求utf8mb4_0900_ai_ci排序规则,但是MySQL 5.7服务器不识别该排序规则,因此服务器悄悄返回到带有latin1_swedish_ci排序规则的latin1字符集。随后,服务器发送latin1结果集,但客户端认为它正在接收utf8mb4,这最终导致UnicodeDecodeError。作为解决办法,您必须显式地使用SET NAMES utf8mb4。我创建了一个问题mysqlclient#504,要求python每次都这样做。

要确认字符集在连接后是不正确的,请重复检查服务器的值character_set_client (语句在其中解释的字符集)、character_set_connection (语句转换为的字符集)和character_set_results (结果集的字符集作为发送方式发送)。如果它们是latin1,尽管客户机以utf8mb4的形式连接,那么这个错误可能是触发的。

代码语言:javascript
复制
with con.cursor() as c:
  c.execute("show variables like 'character_set_%'")
  for row in c:
    print(row)
(b'character_set_client', b'latin1')
(b'character_set_connection', b'latin1')
(b'character_set_database', b'latin1')
(b'character_set_filesystem', b'binary')
(b'character_set_results', b'latin1')
(b'character_set_server', b'latin1')
(b'character_set_system', b'utf8')
(b'character_sets_dir', b'/usr/share/mysql/charsets/')

我认为解决这一问题的办法是在连接之后做以下工作:

代码语言:javascript
复制
# explicitly set connection charset to the same as MySQLdb.connect()
con.query("SET NAMES utf8mb4")
con.store_result()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68970540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档