PostgreSQL: 如何处理导出的数据出现中文乱码问题?

在数据库维护过程中,经常有需求导出生产库的部分数据,并且要求将数据保存为 Excel 形式, 对于 Oracle 来说,这是非常简单的工作,因为有 plsqldev 等图形化工具,且功能非常强大,可以导出 Excel, 对于 PG 来说,这方面的支持就少了,首先图形化界面工具少,另外常用的PG GUI工具 pgadmin 功能非常简单,没有导出数据到 excel 的功能,尽管如此, PostgreSQL 本身提供的 copy 命令可以实现此功能,可以将数据导成 csv 格式。但是在某些 Linux 环境下导出的 csv 文件,传输到 windows 环境下打开中文却显示乱码, 本文介绍两种解决 csv 文件在 windows 下显示为乱码的方法。

方法一: 设置客户端字符集

一般 PostgreSQL 建库都是用的 UTF8 字符集, 在 UTF8 字符集情况下如果中文不能正常显示,可以设置客户端字符集,修改成 “ GBK “ ,命令如下:

修改客户端字符集

1
2
3
4
5
6
7
8
postgres=# show client_encoding;  
client_encoding
-----------------
UTF8
(1 row)

postgres=# set client_encoding='GBK';
SET

copy 导出数据到 GBK 编码类型的 csv 文件

1
2
skytf=# copy skytf.test_2 to '/home/postgres/script/tf/skytf.test_2.csv' with csv header;  
COPY 1000000

备注:此时通过 sftp 将 csv 文件传到 windows 本机,就不会出现乱码了。

方法二: 使用 Iconv 更改文件编码

iconv 是 linux 命令,用来转换文件的编码的 ,手册解释如下 “Convert encoding of given files from one encoding to another”,我们可以使用 iconv 命令转换文件的编码,如果 utf8 编码的文件中文显示为乱码,可以使用 iconv 命令将 UTF8 格式文件转换成 gb18030,参考步骤:

导出数据到 utf8 编码类型文件。

1
2
3
4
5
6
7
8
9
10
11
skytf=# set client_encoding='UTF8';  
SET

skytf=# show client_encoding;
client_encoding
-----------------
UTF8
(1 row)

skytf=# copy skytf.test_2 to '/home/postgres/script/tf/skytf.test_2.csv' with csv header;
COPY 1000000

将文件编码由 utf8 转换成 gb18030

1
iconv -f utf-8 -t gb18030 skytf.test_2.csv -o skytf.test_2_gbk.csv

附:Iconv 命令参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[postgres@tf]$ iconv --help  
Usage: iconv [OPTION...] [FILE...]
Convert encoding of given files from one encoding to another.
Input/Output format specification:
-f, --from-code=NAME encoding of original text
-t, --to-code=NAME encoding for output
Information:
-l, --list list all known coded character sets
Output control:
-c omit invalid characters from output
-o, --output=FILE output file
-s, --silent suppress warnings
--verbose print progress information
-?, --help Give this help list
--usage Give a short usage message
-V, --version Print program version
Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.
For bug reporting instructions, please see:

原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/237816.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论