我在settings.py中使用Django和下面的配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '-',
'USER': '-',
'PASSWORD': '-',
'HOST': '-',
'PORT': '-',
'OPTIONS': {'charset': 'utf8mb4'}
}
}db服务器正在AWS RDS上运行。我有两个EC2实例,其中一个实例能够运行完全相同的代码并获取相同的数据,而在第二个EC2中,我得到了以下错误:
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 bytedjango的html响应还显示了以下内容:
Unicode error hint
The string that could not be encoded/decoded was: \n<p>�</p>\另外,负责抛出错误的代码片段是:
exp = MyModel.objects.all()
**for e in exp:** <-- this line is throwing the error
#do something这两台服务器上的版本:
EC2-1有:
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的副本,并应用了更新:。
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配置的本地配置来尝试调试这个问题。
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)我该试试什么?
发布于 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的形式连接,那么这个错误可能是触发的。
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/')我认为解决这一问题的办法是在连接之后做以下工作:
# explicitly set connection charset to the same as MySQLdb.connect()
con.query("SET NAMES utf8mb4")
con.store_result()https://stackoverflow.com/questions/68970540
复制相似问题