※当サイトの記事には、広告・プロモーションが含まれます。

PostgreSQLのデータ型byteaとJDBCのデータ型の対応を調べてみる

gigazine.net

⇧ 可変の要素を含みつつ、文字数の制限があるというのが厄介ですな。

PostgreSQLのデータ型byteaとJDBCのデータ型の対応を調べてみる

PostgreSQLのbytea型のカラムに、Javaでテキストファイルを保持する要件があり、そう言えば、PostgreSQLJavaの間のデータ型の対応が分からんな、と思ったので調べてみました。

www.postgresql.jp

⇧ドキュメントでは、バージョン7.4まででしか触れられていないっぽいのだけど、

PostgreSQL はバイナリデータの格納方法として 2 つの別々の方法を用意しています。バイナリデータは bytea データ型を使用してテーブル内に格納することも、ラージオブジェクト機能を使用して特殊な形式で別のテーブルに格納し、テーブル内に格納される oid 型の値で参照することもできます。

https://www.postgresql.jp/document/7.4/html/jdbc-binary-data.html

PostgreSQLでバイナリデータを保持する方法としては、大きく分けて、

  1. bytea型
  2. ラージオブジェクトを作成し、テーブルのカラムはoid型にする

の2パターンらしい。

ラージオブジェクトは、

www.postgresql.jp

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

⇧ 一応、素のJDBCJava Database Connectivity)では、

  1. getBytes()
    byte[]
  2. setBytes()
  3. getBinaryStream()
    InputStream
  4. setBinaryStream()

とあるので、PostgreSQLのbytea型に対応しているJavaのデータ型は、

  1. byte[]
  2. InputStream

のどちらかということらしい。

ちなみに、Spring Data JPA とかだと、

stackoverflow.com

blog.vemi.jp

qiita.com

Java側はファイルの内容をbyte[]にして、PostgreSQLのbytea型のカラムに格納するって情報しか見当たらないんだが...

ほとんどのORM(Object Relational Mapper)について、JDBCJava Database Connectivity)のデータ型に則っていると考えて良いんかね?

そして、

の両方について言及しているサンプルが見当たらないんですな...

しかも、

  • バイナリファイル
    → 画像ファイル、動画ファイルなど
  • テキストファイル
    CSVファイル、TSVファイル、XMLファイルなど

で実装が異なったりするのかも分からん...

とりあえず、扱うのがCSVファイルなので、時間を作って動作確認してみるしか無いですかね。

これで週末が潰れるのは確定ですな...

それにしても、意外にJavaでの実例がほとんど無いってのが辛いところですな...

毎度モヤモヤ感が半端ない…

今回はこのへんで。