Python中Django + MySQL将utf8改为utf8mb4后执行manage.py报错怎么办?




这是 mysql 里的日志






这是我 settings.py 里的数据库配置

DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘xxxx’,
‘USER’: ‘xxxxx’,
‘PASSWORD’: ‘xxxxx’,
‘HOST’: ‘localhost’,
‘PORT’: ‘3306’,
‘OPTIONS’:{
‘init_command’:“SET sql_mode=‘STRICT_TRANS_TABLES’”,
‘charset’:‘utf8mb4’,
},
}
}


不知道哪里有问题 ?

搞了一晚上有点头晕
再不行就得明天重装了
Python中Django + MySQL将utf8改为utf8mb4后执行manage.py报错怎么办?


16 回复

看起来是不支持 mysql ? django 版本是啥?


遇到这个问题,通常是因为MySQL的utf8mb4字符集与Django的默认配置不匹配。报错信息里如果提到“Unknown character set”或类似内容,那就是关键。

你需要同时修改Django项目的数据库配置数据表本身。光改Django设置没用,已有的表结构还是旧的。下面是完整的操作步骤和代码:

1. 修改Django数据库设置(settings.py 在DATABASES配置的OPTIONS里,明确指定字符集:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'your_db_name',
        'USER': 'your_user',
        'PASSWORD': 'your_password',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'charset': 'utf8mb4',  # 关键设置
        }
    }
}

2. 修改MySQL中已有数据库和表的字符集 登录MySQL命令行,执行以下SQL语句(将your_db_name替换为你的实际数据库名):

-- 修改数据库默认字符集
ALTER DATABASE your_db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 修改每张表的字符集
USE your_db_name;
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

如果表很多,可以导出整个数据库再重新导入,或者写个脚本来批量修改。

3. 处理迁移文件(如果使用了Django Migrations) 如果之前用utf8生成过迁移文件,可能需要手动修改相关迁移文件中的CharFieldTextField等字段定义,确保它们没有硬编码collation。不过,通常只要完成前两步,运行python manage.py migrate就能正常工作。

4. 验证连接 可以在Django shell里快速检查:

python manage.py shell
>>> from django.db import connection
>>> print(connection.connection.charset)  # 应该输出utf8mb4

常见坑点

  • 确保MySQL版本>=5.5.3,否则不支持utf8mb4
  • 如果用了第三方库或特定字段类型,检查它们是否兼容utf8mb4
  • 修改表字符集后,如果还有乱码或报错,检查连接器(如mysqlclientpymysql)版本是否过旧。

改完这些,再跑manage.py命令应该就没问题了。核心就两步:Django配置和MySQL表结构都要改对。

总结:同时修改Django配置和MySQL表字符集。

DATABASE 前加上
import pymysql
pymysql.install_as_MySQLdb()
试试?

只支持 postgres/oracle/sqlite3 ?啥版本的 Django ?

django1.11.12

django 1.11

还是不行,
我是用 yum 安装的 mysql5.6
我删了重装 mysql 试试。

你没有按 python 和 mysql 依赖包
试试 yum install MySQL-python

安装了这个了。
也运行了 pip install pymsql
还是不行。不知道是还少哪个包

第一步安装驱动:
pip install pymysql
注意你要是使用了虚拟环境一定要在激活之后再执行这条命令。

第二步启用驱动:
在项目的 settings.py 所在的那个目录中找到__init__.py
在前两行加下面两句
import pymysql
pymysql.install_as_MySQLdb()

问题还没到 MYSQL 呢,Python 的 mysql 驱动都还没有,怎么连。

去查一下 django mysql

单就错误信息来看,这事和数据库服务器那边没啥关系,所以你删除再重装 mysql 也不会有任何效果的

/usr/local/lib/python2.7/site-packags/django/db/backends/mysql/
看一下这个路径里有文件没

多谢各位
我用 centos 6.9 安装自带的 mysql5.1 版本。没有 pip install MySQL-python。
这样可以。

我在 centos6.9 上 把 mysql 升级到 5.6 得需要 pip install MySQL-python pymysql

于是通过下面:

pip install MySQL-python
假设错误发生,须要先安装一个开发包:

yum install python-devel
假设还是报错,执行:

yum install mysql-devel.x86_64
然后再执行 pip 命令安装 mysql-python

然后就可以了
现在也在由 utf8 改用 utf8mb4 数据库了


多谢各位

有 pymysql 的情况下就完全不依赖于 mysql-dev
这正是“其它 Linux 发行版”里面,dango 依赖 pymysql 而不依赖 mysql-python 的原因

回到顶部