嗯,我有一个django模型,它存储了一个乐队的名字
所以当一个乐队叫✝✝✝ (交叉)'尝试存储在文本字段中。
这就是错误:
django.db.utils.OperationalError: (1366, "Incorrect string value: '\\xE2\\x9C\\x9D\\xE2\\x9C\\x9D...' for column 'album_name' at row 1")
但这变得很奇怪,因为我有另一个表,其中存储了带信息的JsonField。同名'✝✝✝ (交叉)“”已正确存储。JsonField是一个存储json.dumps的文本字段(dict_with_band_info)。。。因此,在数据库中存储的内容如下 {“姓名”:✝✝✝ (交叉)“…}。重复一下,这之前是一个文本字段,工作正常
那么,为什么要尝试添加“名称”:✝✝✝ (交叉)“到db文本字段显示该错误,但不在其他表中否?”?在执行save()之前,我使用pdb.set_trace()查看值
我想再次提到,即使在我的band info表中JsonField是TextField时,该错误也不会出现,但该错误会出现在band_名称的TextField中,并且正好出现在instance.save()中。这样,我可以推断我的文本_字段已准备好接收unicode,因为在band info表中,jsonfield显示了“✝✝✝ (十字架)”。为什么python在保存band name文本字段的步骤中使用utf-8
唯一不同的是:
当我保存波段信息时,我调用模型,如下所示:
from bands.model import BandInfo
from apis import music_api as api
# Expected to be dict
band_info = api.get_band_info(song="This is a trick", singer="chino moreno")[0]
band = BandInfo()
band.band_info=band_info #{'name':'✝✝✝ (Crosses)'}
band.save()
当我保存乐队名称时:
def save_info(Table, data:dict):
instance_ = Table(
'name': data['name'] #'✝✝✝ (Crosses)'
)
instance_.save()
然后在另一个文件中:
from apis import music_api as api
from bands import snippets
from bands.models import Tracks
track_info = api.get_track_info(song="This is a trick", singer="chino moreno")[0]
snippets.save_info(Tracks, data:dict)
使用:python 3.9.1 django 3.1.7 MySQL workbench 8和社区安装
希望我犯了个明显的错误
MySQL的utf8只允许使用UTF-8中的3个字节表示的Unicode字符。如果您有MySQL 5.5或更高版本,您可以将列编码从utf8更改为utf8mb4。这种编码允许在UTF-8中存储占用4字节的字符
为此,请在Django设置文件中的数据库设置的OPTIONS dict中将charset选项设置为utf8mb4
相关问题 更多 >
编程相关推荐