由于货币格式不同,无法将备份从 postgres 导入到具有相同 postgres 版本的不同服务器

问题描述

我将我的数据库从在 Debian 7.11 上运行的 Postgres 9.1.23 移动到另一台在 Debian 10 上运行 Postgres 9.1.24 的服务器,我无法导入一个使用货币数据类型的数据库,因为我收到输入语法错误

copY Failed for table "x": ERROR:  invalid input Syntax for type money: "zł4.400,00"

我在 Debian 7.11 上的两台 Postgres 服务器上使用相同的语言环境:

postgres=# show lc_collate;
 lc_collate
-------------
 pl_PL.UTF-8
(1 row)

postgres=# show lc_monetary;
 lc_monetary
-------------
 pl_PL.UTF-8
(1 row)

在 Debian 10 上:

postgres=# show lc_collate;
 lc_collate
-------------
 pl_PL.UTF-8
(1 wiersz)

postgres=# show lc_monetary;
 lc_monetary
-------------
 pl_PL.UTF-8
(1 wiersz)

然而,当我尝试在两台服务器上运行 select '12345'::money; 时,我得到了不同的结果,在 Debian 7.11 上:

postgres=# select '12345'::money;
    money
-------------
 zł12.345,00
(1 row)

在 Debian 10 上:

postgres=# select '12345'::money;
    money
-------------
 zł12 345,00
(1 wiersz)

(在 Debian 10 中 2 和 3 之间有一个狭窄的无刹车空格字符 - 0x202F UTF-16)

我需要什么才能成功导入而不会出错?感谢您的帮助。

解决方法

一定是 GNU C 库在这些版本之间改变了 LC_MONETARY 的想法。

我会使用 C 语言环境进行转储和恢复:

PGOPTIONS='-c lc_monetary=C' pg_dump -F c -f dumpfile dbname
PGOPTIONS='-c lc_monetary=C' pg_restore -d newdbname dumpfile