【问题标题】:Django Mysql string convertion utf8 and unicode?Django Mysql字符串转换utf8和unicode?
【发布时间】:2021-06-30 22:22:42
【问题描述】:

嗯,我有一个存储乐队名称的 django 模型。

因此,当一个名为“✝✝✝ (Crosses)”的带试图存储在 TextField 中时,新的麻烦就出现了。 这是错误: 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) 的 TextField ...所以在数据库中存储了类似的东西 {“名称”:“✝✝✝(十字架)”...}。重复一遍,这是之前的 TextField,可以按预期工作。

那么为什么尝试在 db 文本字段中添加 "name": "✝✝✝ (Crosses)" 会显示该错误,但在其他表中却没有?我正在使用 pdb.set_trace() 来查看 save() 之前的值是什么。

我想再次提一下,即使 JsonField 是我的乐队信息表中的 TextField,也不会出现该错误,但该错误出现在 band_name 的 TextField 中并且恰好出现在 instance.save() 中。有了这个,我可以推断出我的 text_fields 已准备好接收 unicode,因为在波段信息表中,jsonfield 显示“✝✝✝ (Crosses)”。为什么python在波段名称文本字段中保存的步骤中是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

好吧,希望我犯了一个明显的错误。

【问题讨论】:

    标签: python mysql django django-models python-3.9


    【解决方案1】:

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

    为此,请在 Django 设置文件的 DATABASES 设置的 OPTIONS 字典中将 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
            }
        }
    }
    

    【讨论】:

    • 是的,但正如我所提到的,有一个表可以正确存储,另一个会引发 OperationalError。我想知道为什么会这样。我已经在选项中有 utf8mb4 设置。 docs.djangoproject.com/en/3.1/ref/unicode
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2014-04-14
    • 2023-03-25
    相关资源
    最近更新 更多