我通过外部程序生成了一个(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
这个的正确语法是什么?
答案 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
所以在你的情况下你可以:
create table t as select ID,CODE,PWHASH::text,EMAIL from users where false;
COPY t (ID,CODE,PWHASH,EMAIL) FROM stdin;
insert into users select ID,CODE,decode(substr(PWHASH,4),'hex'),EMAIL from t;