Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 使用Postgres COPY FROM时如何转换十六进制字符?_Postgresql_Sybase_Postgresql Copy - Fatal编程技术网

Postgresql 使用Postgres COPY FROM时如何转换十六进制字符?

Postgresql 使用Postgres COPY FROM时如何转换十六进制字符?,postgresql,sybase,postgresql-copy,Postgresql,Sybase,Postgresql Copy,我正在使用COPY from将数据从文件导入PostgreSQL数据库表。 我文件中的一些字符串包含十六进制字符(主要是\x0d和\x0a),我希望使用COPY 我的问题是它们被视为常规文本,并且在字符串中保持不变。 如何转换十六进制值 以下是我的情况的一个简化示例: -- The table I am importing to CREATE TABLE my_pg_table ( id serial NOT NULL, value text ); COPY my_pg_tab

我正在使用
COPY from
将数据从文件导入PostgreSQL数据库表。 我文件中的一些字符串包含十六进制字符(主要是\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'
在我看来(出于我不理解的原因),十六进制只有在使用
格式文本
时才会转换,而
格式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,以便于大规模导出/导入


我仍然很想知道为什么十六进制在使用
格式CSV时不会转换

您上一段中的问题的答案:部分文件格式:“反斜杠在CSV格式中不是特殊字符”