目次
はじめに
本記事では、Verticaデータベースに画像などのバイナリデータを扱うする方法をご紹介します。バイナリデータを扱う方法
2通りの方法があります。方法1.バイナリデータのファイルパスをテーブルに格納する方法
ファイル名とファイルパスをテーブル(文字列のデータ型を使用)に保存し、実際のバイナリデータはVertica以外のファイルシステムに格納します。この方法を使用してアプリケーションからVerticaデータベースを参照して画像を表示させたい場合、以下のように処理します。
(1) アプリケーションからVerticaのテーブルに格納されているファイルパスを取得
(2) 上記(1)で取得したファイルパスを元に、アプリケーションから保存されているバイナリデータを読み込む
方法2.バイナリデータをエンコードしてテーブルに格納する方法
事前にバイナリデータをエンコードし、そのエンコードしたデータをテーブルに格納します。使用するデータ型
バイナリデータを格納するためには、以下のどちらかのデータ型を使用します。データ型 | 最大バイト数 |
---|---|
VARBINARY | 65,000 |
LONG VARBINARY | 32,000,000 |
なお、LONG VARBINARY型は、結合や集計処理できないといった制限があるため、可能な限りVARBINARY型を使用することを推奨します。
詳細は以下のマニュアルをご参照ください。
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/SQLReferenceManual/DataTypes/LongDataTypes.htm
COPYコマンドの実行例
以下のCOPYコマンドの実行例は、16進数にエンコードしたバイナリデータのファイル「/tmp/hex_image1.dat」をロードしています。また、フォーマットの指定として「FORMAT ‘hex’」をVARBINARY型のカラムに指定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/*** テーブル定義 ***/ dbadmin=> \d image1 List of Fields by Tables Schema | Table | Column | Type | Size | Default | Not Null | Primary Key | Foreign Key --------+--------+--------+------------------+-------+---------+----------+-------------+------------- public | image1 | col | varbinary(65000) | 65000 | | f | f | /*** COPYコマンドの実行例 ***/ dbadmin=> COPY image1 (col FORMAT 'hex') FROM '/tmp/hex_image1.dat'; Rows Loaded ------------- 1 (1 row) |
格納したデータを参照する実行例
16進数にエンコードしたバイナリデータを参照する場合は、TO_HEX関数を使ってVARBINARY型のカラムを検索します。※TO_HEX関数は、各バイナリ値を2つの16進数値で返します。
本記事の実行例ではcol列をVARBINARY(65000)で作成しており、TO_HEX関数では130000バイトの値が返却され内部的に桁溢れが発生するため、LONG VARBINARY型への変換も加えています。
1 2 3 4 5 |
/*** 検索の実行例 ***/ dbadmin=> SELECT TO_HEX(col::long varbinary) FROM image1; TO_HEX ---------------------------------------------------- 5089474e0a0d0a1a000<・・・中略・・・>004549444e42ae8260 |