4

我正在使用COPY FROM. 我的文件中的一些字符串包含十六进制字符(主要是 \x0d 和 \ x0a),我希望使用COPY.
我的问题是它们被视为常规文本并在字符串中保持不变。
如何转换十六进制值?

这是我的情况的简化示例:

-- 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'
4

1 回答 1

1

在我看来(出于我不明白的原因)十六进制仅在使用时转换FORMAT TEXT并将FORMAT 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.

于 2016-02-03T21:08:48.637 回答