Django Mysql字符串转换utf8和unicode?

2024-05-23 20:12:24 发布

您现在位置:Python中文网/ 问答频道 /正文

嗯,我有一个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和社区安装

希望我犯了个明显的错误


Tags: djangonamefrom文本importinfo名称api
1条回答
网友
1楼 · 发布于 2024-05-23 20:12:24

MySQL的utf8只允许使用UTF-8中的3个字节表示的Unicode字符。如果您有MySQL 5.5或更高版本,您可以将列编码从utf8更改为utf8mb4。这种编码允许在UTF-8中存储占用4字节的字符

为此,请在Django设置文件中的数据库设置的OPTIONS dict中将charset选项设置为utf8mb4

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'my_db',
        'USER': 'my_user',
        'PASSWORD': 'my_pass',
        'HOST': 'my.host',
        'OPTIONS': {
            'charset': 'utf8mb4'  # This is the important line
        }
    }
}

相关问题 更多 >