2016-02-02 74 views
4

我使用COPY FROM將數據從文件導入PostgreSQL數據庫表。 我的文件中的一些字符串包含十六進制字符(主要是\ x0d和\ x0a),我希望使用COPY將它們轉換爲常規文本
我的問題是他們被視爲常規文本並保持字符串不變。
如何獲得轉換的十六進制值?如何在使用Postgres COPY FROM時轉換十六進制字符?

這裏是我的情況一個簡單的例子:

-- The table I am importing to 
CREATE TABLE my_pg_table (
    id serial NOT NULL, 
    value text 
); 

COPY my_pg_table(id, data) 
FROM 'location/data.file' 
WITH CSV 
DELIMITER ' ' -- this is actually a tab 
QUOTE '''' 
ENCODING 'UTF-8' 

示例文件:

1 'some data' 
2 'some more data \x0d' 
3 'even more data \x0d\x0a' 

注:該文件是製表符分隔。現在

,這樣做的:

SELECT * FROM my_pg_table 

會得到我含有十六進制結果。

上下文附加信息:

我的任務是從Sybase表(數百個)和導入數據導出到Postgres的。我使用UNLOAD將數據導出到文件,像這樣:

UNLOAD 
TABLE my_sybase_table 
TO 'location/data.file' 
DELIMITED BY ' ' -- this is actually a tab 
BYTE ORDER MARK OFF 
ENCODING 'UTF-8' 

回答

1

在我看來,這(是有原因的,我不明白),六角只轉換時使用FORMAT TEXTFORMAT CSV將把它作爲定期串。

解決在我的處境問題:
因爲我不得不使用TEXT我沒有足夠的QUOTE選擇了正因爲如此,我不可能再引述我的文件字符串。所以,我需要我的文件格式略有不同,並最終用它來我的表從Sybase出口:

UNLOAD 
    SELECT 
    COALESCE(cast(id as long varchar), '(NULL)'), 
    COALESCE(cast(data as long varchar), '(NULL)') 
    FROM my_sybase_table 
TO 'location/data.file' 
DELIMITED BY ' ' -- still tab delimited 
BYTE ORDER MARK OFF 
QUOTES OFF 
ENCODING 'UTF-8' 

並將其導入到Postgres的:

COPY my_pg_table(id, data) 
FROM 'location/data.file' 
DELIMITER ' ' -- tab delimited 
NULL '(NULL)' 
ENCODING 'UTF-8' 

我用(NULL),因爲我需要一種方法來區分一個空字符串和null。我鑄造每一列long varchar,使我的批量導出/導入更方便。

我還是很想知道爲什麼十六進制在使用FORMAT CSV時不會轉換。

+1

最後一段中問題的答案:https://www.postgresql.org/docs/current/static/sql-copy.html部分文件格式:「反斜槓不是CSV格式的特殊字符」 – azalea

相關問題