Python中如何在Django创建表时设置charset为utf8
django2.2.6,通过 django 自带的 python manage.py migrate 命令建表之后,发现表的 charset 是 latin1,如何设置让 django 创建表的时候默认 charset 是 utf8 呢?
Python中如何在Django创建表时设置charset为utf8
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 makemigrations和migrate时,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。
- 首先,正常创建你的模型(不带
db_table_options)。 - 生成迁移文件后,编辑它,添加一个
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 在哪里设置?

