Python中如何在Django创建表时设置charset为utf8

django2.2.6,通过 django 自带的 python manage.py migrate 命令建表之后,发现表的 charset 是 latin1,如何设置让 django 创建表的时候默认 charset 是 utf8 呢?
Python中如何在Django创建表时设置charset为utf8

7 回复

DATABASES 里面配置了吗


在Django中,模型默认会使用数据库的默认字符集。要显式地为特定表设置utf8字符集,你有几种方法,具体取决于你的Django版本和需求。

方法一:在模型的Meta类中使用db_table_options (Django 4.2+ 推荐)

从Django 4.2开始,这是最直接的方式。你可以在模型的Meta类里定义一个db_table_options字典。

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()

    class Meta:
        db_table_options = {
            'charset': 'utf8',
            # 你还可以添加其他表选项,例如:
            # 'collate': 'utf8_general_ci',
            # 'engine': 'InnoDB',
        }

当你运行python manage.py makemigrationsmigrate时,Django会生成类似下面的SQL:

CREATE TABLE `myapp_mymodel` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `name` varchar(100) NOT NULL,
    `description` longtext NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

方法二:使用自定义的数据库迁移RunSQL操作

如果你的Django版本低于4.2,或者需要对字符集进行更精细的控制(比如只针对某个迁移),可以使用RunSQL

  1. 首先,正常创建你的模型(不带db_table_options)。
  2. 生成迁移文件后,编辑它,添加一个RunSQL操作。
# 在生成的迁移文件中,例如 0001_initial.py
from django.db import migrations, models
import django.db.models.deletion

class Migration(migrations.Migration):

    dependencies = []

    operations = [
        migrations.CreateModel(
            name='MyModel',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=100)),
                ('description', models.TextField()),
            ],
            # 注意:旧版本这里没有 db_table_options 参数
        ),
        # 添加 RunSQL 操作来修改表选项
        migrations.RunSQL(
            sql="ALTER TABLE myapp_mymodel CONVERT TO CHARACTER SET utf8;",
            reverse_sql="ALTER TABLE myapp_mymodel CONVERT TO CHARACTER SET DEFAULT;", # 可选,用于回滚
        ),
    ]

方法三:在数据库配置中设置默认字符集

如果你希望整个数据库的所有新表都使用utf8,可以在settings.py的数据库配置OPTIONS中设置。这会影响所有通过Django创建的表。

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'charset': 'utf8',
            # 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", # 可能需要的其他设置
        }
    }
}

总结建议

对于Django 4.2及以上,直接在模型Meta中使用db_table_options是最清晰和推荐的做法。

#1 是指 option 里面吗?

不是先去数据库里创建的时候 用 create database xxx charset=utf8;指明吗

#3 是的,最后用这种方法解决了。但是想知道 django 的 model 里有没有关于字符编码的设置项

django 可以设置 但是如果你 create db 时候不是 utf8 它也修改不鸟

#5 在哪里设置?

回到顶部