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
相关产品推荐
相关产品推荐

