⇧ 可変の要素を含みつつ、文字数の制限があるというのが厄介ですな。
PostgreSQLのデータ型byteaとJDBCのデータ型の対応を調べてみる
PostgreSQLのbytea型のカラムに、Javaでテキストファイルを保持する要件があり、そう言えば、PostgreSQLとJavaの間のデータ型の対応が分からんな、と思ったので調べてみました。
⇧ドキュメントでは、バージョン7.4まででしか触れられていないっぽいのだけど、
PostgreSQL はバイナリデータの格納方法として 2 つの別々の方法を用意しています。バイナリデータは bytea データ型を使用してテーブル内に格納することも、ラージオブジェクト機能を使用して特殊な形式で別のテーブルに格納し、テーブル内に格納される oid 型の値で参照することもできます。
https://www.postgresql.jp/document/7.4/html/jdbc-binary-data.html
⇧ PostgreSQLでバイナリデータを保持する方法としては、大きく分けて、
- bytea型
- ラージオブジェクトを作成し、テーブルのカラムはoid型にする
の2パターンらしい。
ラージオブジェクトは、
PostgreSQLにはラージオブジェクト機能があります。 これは、特殊なラージオブジェクト構造に格納されたユーザデータに対してストリーム様式のアクセスを提供します。 全体をまるごと簡単に操作するには巨大過ぎるデータ値を操作する場合、ストリーミングアクセスが有用です。
https://www.postgresql.jp/document/15/html/largeobjects.html
⇧ 作成とか面倒くさそう。
で、話をbytea型に戻すと、
bytea データ型を使用するには、単に、getBytes()、setBytes()、getBinaryStream()、setBinaryStream() メソッドを使用して下さい。
https://www.postgresql.jp/document/7.4/html/jdbc-binary-data.html
⇧ 一応、素のJDBC(Java Database Connectivity)では、
- getBytes()
byte[] - setBytes()
- getBinaryStream()
InputStream - setBinaryStream()
とあるので、PostgreSQLのbytea型に対応しているJavaのデータ型は、
- byte[]
- InputStream
のどちらかということらしい。
ちなみに、Spring Data JPA とかだと、
⇧ Java側はファイルの内容をbyte[]にして、PostgreSQLのbytea型のカラムに格納するって情報しか見当たらないんだが...
ほとんどのORM(Object Relational Mapper)について、JDBC(Java Database Connectivity)のデータ型に則っていると考えて良いんかね?
そして、
- Java → PostgreSQL
- PosgreSQL → Java
の両方について言及しているサンプルが見当たらないんですな...
しかも、
で実装が異なったりするのかも分からん...
とりあえず、扱うのがCSVファイルなので、時間を作って動作確認してみるしか無いですかね。
これで週末が潰れるのは確定ですな...
それにしても、意外にJavaでの実例がほとんど無いってのが辛いところですな...
毎度モヤモヤ感が半端ない…
今回はこのへんで。