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

UTF-8编码下pg_dump导出PostgreSQL数据库出现乱码问题

解决pg_dump导出多语言数据乱码问题(Docker + Windows 11环境)

核心原因

Windows 11的命令提示符/PowerShell默认编码为GBK(或UTF-16),而Docker容器内PostgreSQL客户端的环境编码是UTF-8,直接重定向输出到本地文件时,跨环境编码不匹配导致乱码。HeidiSQL作为图形工具,内部自动处理了编码转换,所以导出结果正常。

修正后的导出方案

方法1:临时切换Windows命令行编码后导出

先把Windows命令行编码切换为UTF-8,再执行pg_dump命令,避免重定向时的编码转换错误:

chcp 65001 && docker exec <container-name> /bin/bash -c "PGPASSWORD=password pg_dump --username postgres db -E UTF8" > dump.sql
  • chcp 65001:临时将当前命令行会话编码切换为UTF-8,仅生效一次
  • -E UTF8:明确指定pg_dump导出编码为UTF-8(PostgreSQL中Unicode是UTF8的别名,直接写UTF8更严谨)

方法2:容器内生成文件再复制到本地

绕开Windows命令行的编码限制,先在容器内生成正确编码的dump文件,再复制到本地:

# 1. 在容器内执行导出,生成文件到容器临时目录
docker exec <container-name> /bin/bash -c "PGPASSWORD=password pg_dump --username postgres db -E UTF8 > /tmp/dump.sql"
# 2. 将容器内的文件复制到Windows本地
docker cp <container-name>:/tmp/dump.sql ./dump.sql

这种方法完全规避了跨环境编码转换问题,是最可靠的方案。

验证导出结果

用支持UTF-8的文本编辑器(如VS Code、Notepad++)打开dump.sql,确认阿拉伯文、荷兰文显示正常。不要用Windows自带记事本,它默认可能用GBK打开,需手动切换编码为UTF-8查看。

额外注意事项

  • 检查容器内PostgreSQL的客户端编码:进入容器执行psql -U postgres db -c "SHOW client_encoding;",输出应为UTF8
  • Django-CMS数据库配置需明确指定编码:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'db',
        'USER': 'postgres',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '5432',
        'OPTIONS': {
            'client_encoding': 'utf8',
        },
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:07:45