通过使用从stdin复制将bytea数据导入PostgreSQL

通过使用从stdin复制将bytea数据导入PostgreSQL,postgresql,csv,import,Postgresql,Csv,Import,我通过一个外部程序生成了一个(UTF-8)文件,用于导入PostgreSQL 9.6.1。问题在于bytea字段(PWHASH) 此文件中的代码段(使用制表符作为分隔符) 使用导入时 psql mydb myrole -f test.sql 一切顺利 但是,如果我查询结果,字节数组不是16字节,而是37字节: select passwordhash,length(passwordhash) from users; passwor

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

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

使用导入时

psql mydb myrole -f test.sql
一切顺利

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

select passwordhash,length(passwordhash) from users;
                                 passwordhash                                 | length 
------------------------------------------------------------------------------+--------
 \x45275c78363537423935344432374234414335364641393937443234413546463235363327 |     37
正确的语法是什么?

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

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
因此,在您的情况下,您可以:

  • 将表t创建为select ID、code、PWHASH::text、来自用户的电子邮件,其中false
  • 从stdin复制t(ID、code、PWHASH、EMAIL)
  • 插入用户选择ID、code、decode(substr(PWHASH,4)、'hex')、来自t的电子邮件

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

    7   test1   \\x657B954D27B4AC56FA997D24A5FF2563 test@amce.org
    

    是的,我知道。但这不能用在我的用例中,不是吗?谢谢!但是,文档中提到的语法在哪里?我真的花了一些时间来寻找它:(我通过创建一个带有
    COPY…TO
    的文件找到了它。是的。就是这样做的!再次尝试。
    7   test1   \\x657B954D27B4AC56FA997D24A5FF2563 test@amce.org