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格式中不是特殊字符”