はじめに
本記事では、Verticaデータベースに画像などのバイナリデータを扱うする方法をご紹介します。
バイナリデータを扱う方法
2通りの方法があります。
方法1.バイナリデータのファイルパスをテーブルに格納する方法
ファイル名とファイルパスをテーブル(文字列のデータ型を使用)に保存し、実際のバイナリデータはVertica以外のファイルシステムに格納します。
この方法を使用してアプリケーションからVerticaデータベースを参照して画像を表示させたい場合、以下のように処理します。
(1) アプリケーションからVerticaのテーブルに格納されているファイルパスを取得
(2) 上記(1)で取得したファイルパスを元に、アプリケーションから保存されているバイナリデータを読み込む
方法2.バイナリデータをエンコードしてテーブルに格納する方法
事前にバイナリデータをエンコードし、そのエンコードしたデータをテーブルに格納します。
使用するデータ型
バイナリデータを格納するためには、以下のどちらかのデータ型を使用します。
| データ型 | 最大バイト数 |
|---|---|
| VARBINARY | 65,000 |
| LONG VARBINARY | 32,000,000 |
なお、LONG VARBINARY型は、結合や集計処理できないといった制限があるため、可能な限りVARBINARY型を使用することを推奨します。
詳細は以下のマニュアルをご参照ください。
COPYコマンドの実行例
以下のCOPYコマンドの実行例は、16進数にエンコードしたバイナリデータのファイル「/tmp/hex_image1.dat」をロードしています。
また、フォーマットの指定として「FORMAT ‘hex’」をVARBINARY型のカラムに指定しています。
/*** テーブル定義 ***/
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型への変換も加えています。
/*** 検索の実行例 ***/
dbadmin=> SELECT TO_HEX(col::long varbinary) FROM image1;
TO_HEX
----------------------------------------------------
5089474e0a0d0a1a000<・・・中略・・・>004549444e42ae8260検証バージョンについて
この記事の内容はVertica 9.2で確認しています。
更新履歴
2019/11/01 本記事を公開