postgresql使用dump导入导出过程中遇到的字符集问题

1. 基础知识

需要关心3个字符集,

1)一个是执行命令所在系统环境的字符集,如果是cygdrive,查看LANG默认是utf8,如果是powershell,用chcp命令结果为936,代表gbk。

2)一个是数据库server编码,在psql中运行 show server_encoding,结果为utf8。这个编码不太好改,而且官方文档说了不支持gbk(https://www.postgresql.org/docs/12/multibyte.html)。

3)一个是client编码,show client_encoding,结果是gbk。这个可以通过set client_encoding=xx来改变。

 

2. 遇到的问题及解释

我在powershell里使用pg_dump命令导出全库,然后再使用psql命令导入,遇到了gbk字符在utf8没有对应值的报错。

原因:通过vim查看导出文件编码,显示为utf-161e,不是utf8。虽然client编码是gbk,与文件一致,但是导入是要先经过server,因为与server编码不一致,所以报错。这个原因参考文章:https://www.cnblogs.com/kuang17/p/11378845.html

 

3. 解决方法及教训

将导出文件转码为utf8,终于可以导入了,但是数据的某些行导入时还有问题,会导致整个表数据不会插入。但这已经是最好的结果了。

教训是:以后导出文件时,应关注环境编码,在utf8环境下导出,比如使用cygdrive,或者将powershell的编码改成utf8(chcp 65001),这样导出文件编码就是utf8,与server编码相同,server又会将数据转码为client编码,导入时就不会有任何问题了。

posted on 2019-10-24 09:52  arsh  阅读(2548)  评论(0编辑  收藏  举报

导航