首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Docker Postgres数据库还原后的错误字符

用Docker Postgres数据库还原后的错误字符
EN

Stack Overflow用户
提问于 2022-10-10 23:33:16
回答 2查看 64关注 0票数 0

我使用命令进行备份

代码语言:javascript
复制
docker exec -t arcane-aio pg_dump arcane-aio -c -U admin > arcane_aio_db.sql

我使用命令恢复备份。

代码语言:javascript
复制
cat arcane_aio_db.sql | docker exec -i arcane-aio psql -U admin -d arcane-aio

一切都是好的,但所有的俄罗斯符号都被"?“所取代。

还原之前的字符串值是Привет, hi!。备份还原后的字符串值为??????, hi!

我检查了备份的编码,备份前的数据库,还原后的数据库,它们是相同的(en_US.utf8)。难道这个编码不支持俄语吗?

我们在使用Windows。

在将系统编码从Cyrillic更改为UTF-8后,数据转储中的值将变得正确。

但在恢复之后,我们还能看到"?“而不是数据库中的俄罗斯符号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-11 01:14:30

cat命令使用shell字符编码。

您是否试过简单地运行第一部分:

代码语言:javascript
复制
cat arcane_aio_db.sql

我打赌它也显示了?

您需要在两边将字符集设置为相同的编码。你可能一边是UTF-8,另一边是俄语。

写入文件的管道是二进制的,不关心编码,但cat关心。

您可以检查您的编码

代码语言:javascript
复制
echo $LANG

确保双方都是UTF-8,这应该能解决你的问题。

**编辑

解决方法是在容器中执行备份和还原:

代码语言:javascript
复制
#get into the container
docker exec -it arcane-aio /bin/bash
# in the container run:
pg_dump arcane-aio -c -U admin > arcane_aio_db.sql
# try restore:
cat arcane_aio_db.sql | psql -U admin -d arcane-aio

如果这样做有效,那么这是您的码头容器和本地机器之间的编码问题。您可以在容器内执行转储/还原操作,并使用docker cp将文件复制到/输出

另一个想法是,SQL 'cat‘可能包含引号、$或#或其他有问题的字符,直接发送到TTY中。

因此,您可能想试一试,以确保整件事被引用:

代码语言:javascript
复制
eval "echo \"$(cat arcane_aio_db.sql)\"" | docker exec -t arcane-aio psql -U admin -d arcane-aio
票数 1
EN

Stack Overflow用户

发布于 2022-10-11 06:58:16

由于pg_dump包含正确设置client_encoding的指令,所以目标数据库中的数据将是正确的。也就是说,除非数据库编码是SQL_ASCII,否则如果您需要西里尔字符,那么无论如何您都会丢失。

问题必须与您的客户端软件或终端编码。

要确定数据库中的字符是正确的,请连接psql并将字符串转换为bytea,以便您可以看到字节:

代码语言:javascript
复制
SELECT charcol, CAST(charcol TO bytea)
FROM tab WHERE ...;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74021608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档