这个错误表明 Django 在连接 MySQL/MariaDB 时,无法初始化字符集 utf8,通常是因为数据库的字符集配置不正确或缺少字符集文件。以下是详细的解决方案:
问题原因
-
字符集文件缺失:MySQL/MariaDB 的字符集文件(如
utf8.xml)可能丢失或路径配置错误。 -
字符集配置错误:数据库的默认字符集未正确设置为
utf8或utf8mb4。 -
Django 配置问题:Django 的数据库配置中未明确指定字符集。
解决方法
1. 检查字符集文件
确认 MySQL/MariaDB 的字符集文件是否存在:
ls /usr/share/mysql/charsets/
-
如果目录不存在或为空,可能是安装不完整。
-
如果目录存在但缺少
utf8.xml,需修复安装。
2. 重新安装 MySQL/MariaDB
如果字符集文件缺失,重新安装 MySQL/MariaDB 以修复文件:
对于 MariaDB
sudo yum reinstall mariadb-server mariadb-client
对于 MySQL
sudo yum reinstall mysql-server mysql-client
3. 修改 Django 的数据库配置
在 Django 的 settings.py 中,明确指定字符集为 utf8mb4(推荐)或 utf8:
python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名',
'USER': '用户名',
'PASSWORD': '密码',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4', # 使用 utf8mb4 支持更广泛的字符集
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
4. 修改 MySQL/MariaDB 的默认字符集
确保 MySQL/MariaDB 的默认字符集为 utf8mb4:
步骤 1:编辑配置文件
打开 MySQL/MariaDB 的配置文件(通常为 /etc/my.cnf 或 /etc/mysql/my.cnf),在 [mysqld] 部分添加以下内容:
ini
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
步骤 2:重启 MySQL/MariaDB
sudo systemctl restart mariadb # 对于 MariaDB sudo systemctl restart mysqld # 对于 MySQL
步骤 3:验证字符集
登录 MySQL/MariaDB,运行以下命令:
sql
SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';
确保 character_set_server 和 collation_server 的值为 utf8mb4。
5. 修复现有数据库的字符集
如果数据库已创建,需修改其字符集:
修改数据库字符集
sql
ALTER DATABASE 数据库名 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
修改表字符集
sql
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
6. 检查 Django 的迁移文件
如果问题发生在运行迁移时,检查迁移文件是否包含字符集相关的操作。可以尝试删除迁移文件并重新生成:
rm -rf 应用名/migrations/ python manage.py makemigrations python manage.py migrate
7. 检查 Python 的 MySQL 驱动
确保使用的 MySQL 驱动(如 mysqlclient 或 pymysql)是最新版本:
pip install --upgrade mysqlclient
总结
-
核心问题:字符集文件缺失或配置错误。
-
推荐方案:
-
重新安装 MySQL/MariaDB 以修复字符集文件。
-
在 Django 配置中明确指定
utf8mb4字符集。 -
修改 MySQL/MariaDB 的默认字符集为
utf8mb4。
-
如果仍有问题,请提供以下信息:
-
你的操作系统版本(如 CentOS 7)。
-
MySQL/MariaDB 的版本。
-
Django 的版本。
336

被折叠的 条评论
为什么被折叠?



