天天看點

PostgreSQL copy (quote,DELIMITER,...) single byte char 的輸入

标簽

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的寫法,請參考末尾文檔。

https://github.com/digoal/blog/blob/master/201805/20180510_01.md#%E5%8F%82%E8%80%83 參考

《PostgreSQL 轉義、UNICODE、與SQL注入》

繼續閱讀