postgresql提供了COPY命令用於表與文件(和標準輸出,標準輸入)之間的相互拷貝,copy to由表至文件,copy from由文件至表。sql
示例1.將整張表拷貝至標準輸出數據庫
test=# copy tbl_test1 to stdout; 1 HA 12 2 ha 543
示例2.將表的部分字段拷貝至標準輸出,並輸出字段名稱,字段間使用','分隔post
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
將標準輸入拷貝至表中須要注意幾點excel
1.字段間分隔符默認使用【Tab】鍵postgresql
2.換行使用回車鍵it
3.結束使用反斜線+英文據點(\.)io
4.最好指定字段順序,要否則可能會錯位賦值test
示例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