postgresql提供了COPY命令用於表與文件(和標准輸出,標准輸入)之間的相互拷貝,copy to由表至文件,copy from由文件至表。
示例1.將整張表拷貝至標准輸出
test=# copy tbl_test1 to stdout; 1 HA 12 2 ha 543
示例2.將表的部分字段拷貝至標准輸出,並輸出字段名稱,字段間使用','分隔
test=# copy tbl_test1(a,b) to stdout delimiter ',' csv header; a,b 1,HA 2,ha
示例3.將查詢結果拷貝至標准輸出
test=# copy (select a,b from tbl_test1 except select e,f from tbl_test2 ) to stdout delimiter ',' quote '"' csv header; a,b 2,ha
將標准輸入拷貝至表中需要注意幾點
1.字段間分隔符默認使用【Tab】鍵
2.換行使用回車鍵
3.結束使用反斜線+英文據點(\.)
4.最好指定字段順序,要不然可能會錯位賦值
示例4.將標准輸入拷貝至表中
test=# copy tbl_test1(a,b,c) from stdin; Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself. >> 1 公舉 公主 >> 2 萬歲 萬萬歲 >> \. COPY 2 test=# select * from tbl_test1 ; a | b | c ---+------+-------- 1 | HA | 12 2 | ha | 543 1 | 公舉 | 公主 2 | 萬歲 | 萬萬歲 (4 rows)
示例5.從標准輸入拷貝至表中,並將標准輸入第一行作為字段名(和表中不符也沒關系,copy會自動忽略第一行),字段分隔符為','
test=# copy tbl_test1(a,b,c) from stdin delimiter ',' csv header; Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself. >> a,b,c >> 3,你好,hello >> 4,超人,super >> \. COPY 2 test=# select * from tbl_test1 ; a | b | c ---+------+-------- 1 | HA | 12 2 | ha | 543 1 | 公舉 | 公主 2 | 萬歲 | 萬萬歲 3 | 你好 | hello 4 | 超人 | super (6 rows)
以上是表與標准輸出和標准輸入間的相互拷貝,表與文件的拷貝和以上完全相同,只是將標准輸出和標准輸入換成文件。需要注意的是:
1.數據庫用戶必須有文件所在的路徑的寫權限。
2.如果表存在中文字符,導出至csv文件時需要設置編碼為GBK,否則使用excel打開是中文顯示亂碼。
3.將文件導入表中時仍要考慮編碼問題
示例6.將表拷貝至csv文件中
test=# copy tbl_test1 to '/tmp/tbl_test1.csv' delimiter ',' csv header; COPY 6
使用excel打開文件,中文顯示為亂碼
示例7. 將表以GBK編碼拷貝至csv文件中
test=# copy tbl_test1 to '/tmp/tbl_test1.csv' delimiter ',' csv header encoding 'GBK'; COPY 6
使用excel打開,中文顯示正常
示例8.將剛才導出的文件再次拷貝至表中,使用默認編碼UTF8
test=# copy tbl_test1(a,b,c) from '/tmp/tbl_test1.csv' delimiter ',' csv header; ERROR: invalid byte sequence for encoding "UTF8": 0xb9 CONTEXT: COPY tbl_test1, line 4
示例9.將剛才導出的文件再次拷貝至表中,使用GBK編碼
test=# copy tbl_test1(a,b,c) from '/tmp/tbl_test1.csv' delimiter ',' csv header encoding 'GBK'; COPY 6