2017-02-08 15 views
2

PostgreSQL 9.6.1にインポートするための外部プログラムで(UTF-8)ファイルを生成しました。問題はbyteaフィールド(PWHASH)です。COPY FROM stdinを使ってバイトアデータをPostgreSQLにインポートする

このファイルからスニペット(区切り文字としてTABを使用して)

COPY USERS (ID,CODE,PWHASH,EMAIL) FROM stdin; 
7 test1 E'\\\\x657B954D27B4AC56FA997D24A5FF2563' [email protected] 
\. 

psql mydb myrole -f test.sql 

とインポートすべてがうまくいきます。私は結果を照会する場合

しかし、バイト配列は16のバイトではなく、37バイトではありません。

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

このための正しい構文は何ですか?

答えて

3

入力ファイルのフォーマットが間違っています。それは次のようになります:

7 test1 \\x657B954D27B4AC56FA997D24A5FF2563 [email protected] 
+0

ありがとう!しかし、この構文はどこに書かれていますか?私は本当にそれのためにいくつかの時間を探しました:( – rmuller

+0

'COPY ... TO'でファイルを作成して見つけました。 –

+0

はい、それを行う方法です! – rmuller

0

私は信じているデータを "準備する"必要があります。ここのようななめらか:

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;
+0

はい、私は知っています。しかし、これは私のユースケースでは使えませんね。 – rmuller

関連する問題