我使用命令进行备份
docker exec -t arcane-aio pg_dump arcane-aio -c -U admin > arcane_aio_db.sql我使用命令恢复备份。
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后,数据转储中的值将变得正确。
但在恢复之后,我们还能看到"?“而不是数据库中的俄罗斯符号。
发布于 2022-10-11 01:14:30
cat命令使用shell字符编码。
您是否试过简单地运行第一部分:
cat arcane_aio_db.sql我打赌它也显示了?
您需要在两边将字符集设置为相同的编码。你可能一边是UTF-8,另一边是俄语。
写入文件的管道是二进制的,不关心编码,但cat关心。
您可以检查您的编码
echo $LANG确保双方都是UTF-8,这应该能解决你的问题。
**编辑
解决方法是在容器中执行备份和还原:
#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中。
因此,您可能想试一试,以确保整件事被引用:
eval "echo \"$(cat arcane_aio_db.sql)\"" | docker exec -t arcane-aio psql -U admin -d arcane-aio发布于 2022-10-11 06:58:16
由于pg_dump包含正确设置client_encoding的指令,所以目标数据库中的数据将是正确的。也就是说,除非数据库编码是SQL_ASCII,否则如果您需要西里尔字符,那么无论如何您都会丢失。
问题必须与您的客户端软件或终端编码。
要确定数据库中的字符是正确的,请连接psql并将字符串转换为bytea,以便您可以看到字节:
SELECT charcol, CAST(charcol TO bytea)
FROM tab WHERE ...;https://stackoverflow.com/questions/74021608
复制相似问题