2012-01-18
バイナリ形式COPY文の怪
ちょっと仕事の関係でバイナリフォーマットをCOPYしようと思って気がついたこと。
(環境はPostgreSQL 9.1.2)
PostgreSQLのCOPY文ではOPTIONでFOMATの指定が可能なのだが、text, csvは普通に記述できるけど、binaryを書くとsyntaxエラーになってしまう。(´・ω・`)
db=# COPY foo FROM STDIN WITH ( FORMAT binary );
ERROR: syntax error at or near "binary"
もちろんtextやcsvはそのまま記述可能。
db=# COPY foo FROM STDIN WITH ( FORMAT text );
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>
binaryの場合は二重引用符で引用しないと駄目っぽい。
db=# COPY foo FROM STDIN WITH ( FORMAT "binary" ););
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>
これは一体どういうことなのか・・・。PostgreSQL文書のCOPYのページにも、特にbinaryのときには二重引用符で引用しなければならない、とは記述がない。
ちょいと不思議な気がしたので、PostgreSQL文書のSQLキーワードのページを見ると・・・
| binary | 予約(関数または型として使用可) |
| csv | 未予約 |
| text | 未予約 |
となっている。そう、binaryだけキーワードの扱いが違うのだ。
逆に言えば、csvやtextというトークンは実はそのまま名標に書けるということだ。どういうことかと言うと、csvという名前のカラムやtextという名前のテーブルが作成できるということ。binaryという名前は引用しないとそういうことは出来ない。
こうなった経緯は良くわからなかったが、PostgreSQL - bugs - COPY .... WITH (FORMAT binary) causes syntax error at or near "binary" | Threaded Viewを流し読みした感じでは旧バージョン(7.3以前)との互換性などが関係しているようだ。
過去の経緯はともかくとして、とりあえずのPostgreSQL文書COPYのページには「binaryは二重引用符で括らないと駄目よ」という注意書きを書いて欲しいなあと思うのであった。
トラックバック - http://d.hatena.ne.jp/nuko_yokohama/20120118/1326864475
リンク元
- 59 http://pipes.yahoo.com/pipes/pipe.info?_id=c021b165b3a7976a4259958b8a56b5af
- 2 http://bit.ly/tLHzfO
- 2 http://bit.ly/wfyiDv
- 1 http://10.7.198.80:8080/home
- 1 http://10.7.198.80:8080/public_timeline
- 1 http://bit.ly/AvwVwt
- 1 http://bit.ly/tnZT5n
- 1 http://d.hatena.ne.jp/keyword/正規表現
- 1 http://longurl.org
- 1 http://t.co/qlf3V3ix
