postgresql 字符集server_encoding变更

在使用postgres_fdw进行远程数据库转储时遇到字符集不兼容问题,本地为EUC_CN,远程为UTF8,导致数据插入错误。可以采用数据导出再导入的方式解决,但此方法不保证事务安全,也可能因编码问题导致部分数据丢失。另一种方法是重新初始化数据库集群,更改编码为UTF8,并恢复备份。
--今天在使用postgres_fdw做远端数据库转储时,发现本地所使用的字符集与远端是不同的,造成插入数据错误
postgres=# insert into t select * from for_t;    
ERROR:  character with byte sequence 0xe7 0xa6 0xb4 in encoding "UTF8" has no equivalent in encoding "EUC_CN"
CONTEXT:  Remote SQL command: SELECT  pnr FROM rudy.t


--本地的编码
postgres=# select name,setting,context from pg_settings  where name like '%encoding%';     
      name       | setting | context  
-----------------+---------+----------
 client_encoding | UTF8    | user
 server_encoding | EUC_CN  | internal
 
 --远端的数据库编码
 dev=# select name,setting,context from pg_settings  where name like '%encoding%';     
      name       | setting | context  
-----------------+---------+----------
 client_encoding | UTF8    | user
 server_encoding | UTF8    | internal
 
 
 --可以选择导出数据,使用inserts方式,再执行导入
 pg_dump -d dev -t rudy.t --data-only --inserts -f /tmp/t.sql
 psql -l -f /tmp/t.sql
 
 --注意使用这种方式导入时比较慢
 --如果其中某一行命令出错,那么将仅有该行数据丢失,而不是整个表的数据丢失,即不能做到事务安全
 --由于编码的原因会造成一部分数据不能导入成功
 ERROR:  character with byte sequence 0xe7 0xa6 0xb4 in encoding "UTF8" has no equivalent in encoding "EUC_CN"
 
 
 
 --也可以重新初始化一个新的数据库集群
--备份整个数据库集群
 pg_dumpall -f /tmp/pg_dump.sql
  mv data/ data_bak
  initdb -E UTF8 --local=C
  --覆盖新生成的配置文件
  cp ../data_bak/postgresql.conf .
  cp ../data_bak/pg_hba.conf . 
 --导入之前导出的文件则可
  psql -f /tmp/pg_dump.sql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值