标簽
PostgreSQL , copy , 分隔符 , 包圍符号 , 轉義 , unicode
https://github.com/digoal/blog/blob/master/201805/20180510_01.md#%E8%83%8C%E6%99%AF 背景
PostgreSQL 可以通過COPY批量導入或導出資料,如果是檔案操作是在資料庫的SERVER端操作,如果是STDIN, STDOUT則是通過協定透傳到用戶端。
Command: COPY
Description: copy data between a file and a table
Syntax:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
TO { 'filename' | PROGRAM 'command' | STDOUT }
[ [ WITH ] ( option [, ...] ) ]
where option can be one of:
FORMAT format_name
OIDS [ boolean ]
FREEZE [ boolean ]
DELIMITER 'delimiter_character'
NULL 'null_string'
HEADER [ boolean ]
QUOTE 'quote_character'
ESCAPE 'escape_character'
FORCE_QUOTE { ( column_name [, ...] ) | * }
FORCE_NOT_NULL ( column_name [, ...] )
FORCE_NULL ( column_name [, ...] )
ENCODING 'encoding_name'
COPY指令如下,允許使用者指定格式,比如分隔符等。
QUOTE
ESCAPE
DELIMITER
以上三個必須是single one-byte字元。如果是特殊字元如何輸入呢?
https://github.com/digoal/blog/blob/master/201805/20180510_01.md#%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E4%BD%9C%E4%B8%BAquote-escape-delimiter 特殊字元作為QUOTE, ESCAPE, DELIMITER
可以使用escape或unicode模式輸入特殊字元。
例如TAB作為分隔符時,這樣輸入
postgres=# copy aa from '/home/digoal/aa.csv' with (delimiter U&'\0009');
COPY 10
postgres=# copy aa from '/home/digoal/aa.csv' with (delimiter E'\t');
COPY 10
使用ascii可以得到字元的ASCII碼
postgres=# select ascii(E'\t');
ascii
-------
9
(1 row)
unicode的寫法,請參考末尾文檔。