使用COPY FROM stdin将bytea数据导入PostgreSQL

时间:2017-02-08 15:43:34

标签: postgresql csv import

我通过外部程序生成了一个(UTF-8)文件,用于导入PostgreSQL 9.6.1。问题是bytea字段(PWHASH)。

此文件中的代码段(使用TAB作为分隔符)

COPY USERS (ID,CODE,PWHASH,EMAIL) FROM stdin;
7   test1   E'\\\\x657B954D27B4AC56FA997D24A5FF2563'    test@amce.org
\.

使用

导入时
psql mydb myrole -f test.sql

一切顺利。

但是,如果我查询结果,则字节数组不是16个字节,而是37个字节:

select passwordhash,length(passwordhash) from users;
                                 passwordhash                                 | length 
------------------------------------------------------------------------------+--------
 \x45275c78363537423935344432374234414335364641393937443234413546463235363327 |     37

这个的正确语法是什么?

2 个答案:

答案 0 :(得分:4)

输入文件的格式错误。它应该是这样的:

7   test1   \\x657B954D27B4AC56FA997D24A5FF2563 test@amce.org

答案 1 :(得分:0)

我必须“准备”我相信的数据。 Smth喜欢这里:

t=# insert into u select 'x657B954D27B4AC56FA997D24A5FF2563';
INSERT 0 1
Time: 5990.809 ms
t=# select b from u;
                                  b
----------------------------------------------------------------------
 \x783635374239353444323742344143353646413939374432344135464632353633
(1 row)

Time: 0.234 ms
t=# insert into u select  decode('657B954D27B4AC56FA997D24A5FF2563','hex');
INSERT 0 1
Time: 62.767 ms
t=# select b from u;
                                  b
----------------------------------------------------------------------
 \x783635374239353444323742344143353646413939374432344135464632353633
 \x657b954d27b4ac56fa997d24a5ff2563
(2 rows)

Time: 0.208 ms

所以在你的情况下你可以:

  1. create table t as select ID,CODE,PWHASH::text,EMAIL from users where false;
  2. COPY t (ID,CODE,PWHASH,EMAIL) FROM stdin;
  3. insert into users select ID,CODE,decode(substr(PWHASH,4),'hex'),EMAIL from t;