如何在Django 2.*+mysqlclient环境下设置MySQL数据库排序规则?
解决Django 2.* + mysqlclient下MySQL表utf8mb4排序规则设置问题
我之前在Django 2.x项目里用mysqlclient的时候也碰到过一模一样的问题——明明在数据库配置里加了charset: utf8mb4,但生成的表还是用的utf8编码和对应的排序规则。下面是我亲测有效的解决思路:
1. 先确保数据库本身的字符集和排序规则正确
如果你的数据库是之前创建的,默认可能还是utf8,新建的表会直接继承数据库的配置。你可以先登录MySQL客户端,执行以下命令修改数据库的默认设置:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
要是你是新建数据库,创建时直接指定规则更省心:
CREATE DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
2. 完善Django的数据库配置
只设置charset还不够,得在OPTIONS里添加init_command,强制MySQL连接使用utf8mb4和目标排序规则。修改后的配置示例如下:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'your_database_name', 'USER': 'your_db_user', 'PASSWORD': 'your_db_password', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS': { 'charset': 'utf8mb4', 'init_command': "SET sql_mode='STRICT_TRANS_TABLES', DEFAULT_STORAGE_ENGINE=InnoDB; SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;", }, } }
这里的SET NAMES utf8mb4 COLLATE utf8mb4_general_ci会强制当前连接的字符集和排序规则,确保Django创建表时用正确的参数。
3. 处理已存在的表(如果有)
要是已经有一批表是utf8编码的,得手动修改这些表的规则。执行以下SQL命令(替换成你的表名):
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
想批量修改所有表的话,可以用这个查询生成批量命令:
SELECT CONCAT('ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') FROM information_schema.tables WHERE table_schema = 'your_database_name' AND table_type = 'BASE TABLE';
执行后会输出所有表的修改语句,复制出来批量执行就行。
4. 模型层面的可选设置(针对新表)
如果你想确保某个特定模型的表强制用指定排序规则,Django 2.2及以上版本支持在模型的Meta类里添加db_collation属性:
from django.db import models class YourModel(models.Model): name = models.CharField(max_length=255) class Meta: db_collation = 'utf8mb4_general_ci'
这样这个模型生成的表就会无视数据库默认设置,直接用指定的排序规则。
最后别忘了,修改配置后重新运行makemigrations和migrate,确保新的表结构生效。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

