postgresql 字符集server_encoding变更

--今天在使用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

你可能感兴趣的:(postgresql_优化,postgresql_高可用)