You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL迁移至Django models.py时西里尔字符编码异常问题

解决Django inspectdb导出模型时西里尔字符乱码问题

问题场景

执行数据库表迁移操作时,运行命令:

python manage.py inspectdb > example/models.py

所有西里尔文字符均被转换为未知字符(示例:id_шёїюф ∙хую)。已确认数据库服务器与Python脚本编码均为UTF-8,尝试过以下方法但问题仍存在:

  • 执行show server_encoding;,结果为UTF8;
  • 设置set PYTHONIOENCODING=UTF-8;
  • 在settings.py中添加配置:
    'OPTIONS': {
        'client_encoding': 'UTF8',
    }
    

当前使用psycopg包。

解决方案

1. 使用inspectdb内置输出参数(推荐)

绕过Shell重定向,直接让inspectdb命令写入文件,避免Shell编码干扰:

python manage.py inspectdb --output example/models.py

该方法通过Django内部逻辑处理文件编码,完全规避Shell层面的转码问题。

2. 强制Python标准输出编码

若必须使用Shell重定向,可在启动Python时强制指定标准输出编码:

python -X utf8 manage.py inspectdb > example/models.py

或通过代码层面强制配置:

python -c "import sys; sys.stdout.reconfigure(encoding='utf-8'); from django.core.management import execute_from_command_line; execute_from_command_line(['manage.py', 'inspectdb'])" > example/models.py

3. 验证数据库字符集全链路配置

除server_encoding外,需检查数据库的排序规则与字符分类设置,在PostgreSQL终端执行:

show lc_collate;
show lc_ctype;
show client_encoding;

确保所有返回结果均为UTF8或对应西里尔语的UTF-8变种(如ru_RU.UTF-8)。若不一致,修改数据库配置:

ALTER DATABASE your_database_name SET lc_collate = 'ru_RU.UTF-8';
ALTER DATABASE your_database_name SET lc_ctype = 'ru_RU.UTF-8';

修改后重启PostgreSQL服务生效。

4. 强化psycopg连接编码参数

在settings.py的数据库配置中,添加额外参数强制编码传递:

DATABASES = {
    'default': {
        # 其他基础配置(NAME/USER/HOST等)
        'OPTIONS': {
            'client_encoding': 'UTF8',
            'options': '-c client_encoding=utf8'
        },
    }
}

内容的提问来源于stack exchange,提问作者arpzigger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:11:01