Binary Large Object (BLOB) は、音声、動画、画像ファイルなどの大きなバイナリファイルを格納するために使用されるデータ型です。LindormTable SQL は BLOB データ型をサポートしています。 Lindorm ワイドテーブルの非プライマリキー列のデータ型を BLOB に設定できます。このトピックでは、LindormTable で BLOB データ型を使用する方法について説明します。
適用可能なエンジン
BLOB データ型は LindormTable にのみ適用できます。
前提条件
LindormTable のバージョンが 2.4.1 以後であること。 LindormTable のバージョンを表示またはアップグレードする方法の詳細については、「LindormTable のリリースノート」および「Lindorm インスタンスのマイナーエンジンバージョンのアップグレード」をご参照ください。
LindormTable で S3 互換機能が有効になっていること。詳細については、「S3 互換機能の有効化」をご参照ください。
BLOB データ型は招待プレビュー中です。トライアルを申請するには、Lindorm のテクニカルサポート (DingTalk ID: s0s3eg3) にお問い合わせください。
使用上の注意
Lindorm ワイドテーブルのプライマリキー列のデータ型を BLOB に設定することはできません。
DDL
テーブルの作成時またはテーブルのスキーマの変更時に、テーブルの列のデータ型を BLOB に設定できます。
次のステートメントを実行して、tb という名前のテーブルを作成できます。 tb テーブルでは、p1 列をプライマリキー列として指定し、p1 のデータ型を INT に設定し、c1 列と c2 列を非プライマリキー列として指定し、c1 と c2 のデータ型をそれぞれ VARCHAR と BLOB に設定します。
CREATE TABLE tb (p1 INT, c1 VARCHAR, c2 BLOB, PRIMARY KEY(p1));
説明テーブル名にアンダースコア (_) などの特殊文字が含まれている場合は、ステートメントで BLOB_BUCKET_NAME 属性を指定します。 BLOB_BUCKET_NAME 属性の詳細については、「テーブルオプション」をご参照ください。
テーブルを作成するために使用される構文の詳細については、「CREATE TABLE」をご参照ください。
次のステートメントを実行して、tb テーブルに c3 列を追加し、c3 列のデータ型を BLOB に設定できます。
ALTER TABLE tb ADD COLUMN c3 BLOB;
重要テーブルに列を追加するために使用される構文の詳細については、「ALTER TABLE」をご参照ください。
バージョンが 2.6.4 より前の LindormTable では、テーブルの作成時に BLOB 型の列を設定せず、テーブルの作成後に
ALTER TABLE ADD COLUMN
構文を使用して BLOB 型の列を追加すると、列へのデータの書き込みまたは読み取り時にエラーが発生します。インスタンスの LindormTable バージョンを 2.6.4 以降にアップグレードすることをお勧めします。 LindormTable のバージョンを表示またはアップグレードする方法の詳細については、「LindormTable のリリースノート」および「Lindorm インスタンスのマイナーエンジンバージョンのアップグレード」をご参照ください。LindormTable 2.6.4 以降のバージョンでは、
ALTER TABLE ADD COLUMN
構文を使用して BLOB 型の列をテーブルに追加する場合、BLOB_BUCKET_NAME の値は、デフォルトでデータベース名とテーブル名を使用して連結されます。連結された BLOB_BUCKET_NAME の値がバケットの命名規則に準拠していない場合は、エラーが報告されます。 この場合、BLOB_BUCKET_NAME に有効な値を明示的に設定できます。例:ALTER TABLE tb_name SET 'BLOB_BUCKET_NAME'='my-bucket-name';
。バケットの命名規則の詳細については、「テーブルオプション」をご参照ください。テーブルに BLOB_BUCKET_NAME 属性が既に設定されている場合は、その値を変更しないでください。次の操作を実行して、テーブルに BLOB_BUCKET_NAME 属性が設定されているかどうかを確認できます。クラスタ管理システムにログオンします。 [概要] ページで、確認するテーブルの名前をクリックします。 [現在のテーブル] セクションで、[テーブル属性の表示] をクリックし、BLOB_BUCKET_NAME 属性の値を表示します。クラスタ管理システムへのログオン方法の詳細については、「クラスタ管理システムへのログオン」をご参照ください。
DML
BLOB データに対する DML 操作を実行するには、Lindorm JDBC ドライバーのみを使用できます。詳細については、「Java JDBC API を使用してアプリケーションを開発する」をご参照ください。
BLOB データの書き込み
次の形式でパラメータを設定して、BLOB 列にデータを書き込むことができます。PreparedStatement#setBlob(int parameterIndex, InputStream inputStream, long length)
。 inputStream
パラメータは、BLOB 列に書き込む InputStream オブジェクトを指定します。 length
パラメータは、InputStream オブジェクト内のデータのサイズを指定します。次のコードは、BLOB 列にデータを書き込む方法の例を示しています。
String upsert = "upsert into " + tableName + "(p1,c1,c2) values(?, ?, ?)";
int len = 20*1024*1024 + 3;
byte[] v = new byte[len];
try (PreparedStatement pStmt = conn.prepareStatement(upsert)) {
pStmt.setInt(1, 1);
pStmt.setString(2, "123");
pStmt.setBlob(3, new ByteArrayInputStream(v), len); // データストリームを介して BLOB 列にデータを書き込みます。
pStmt.executeUpdate();
}
BLOB データの読み取り
次の 2 つの方法のいずれかを使用して、BLOB 列のデータを読み取ることができます。
方法 1: BLOB 列の 1 行のすべてのデータを一度に読み取り、データをバイト配列に保存します。
// BLOB 列の 1 行のすべてのデータを一度に読み取ります。 ResultSet resultSet = stmt.executeQuery("select * from " + tableName + " where p1 = 1" ); byte[] readBytes2 = resultSet.getBytes(3);
方法 2: BLOB 列から取得した InputStream オブジェクトのデータを読み取ります。
説明この方法は、Lindorm JDBC ドライバーのバージョンが 2.1.3 以降の場合にのみ使用できます。
ストリームを使用して、後続の操作で BLOB 列から読み取られたデータを処理するには、この方法を使用してデータを読み取ります。
// BLOB 列から取得した InputStream オブジェクトのデータを読み取ります。 ResultSet resultSet = stmt.executeQuery("select * from " + tableName + " where p1 = 1" ); Blob blob = resultSet.getBlob(3); InputStream inputStream = blob.getBinaryStream(); ....// ストリーミング処理のために BLOB 列から取得した InputStream オブジェクトのデータを読み取ります。 blob.free(); // データを取得した後、BLOB オブジェクトを解放します。
サポートされている関数
SQL クエリで次の関数を使用して、BLOB データを管理できます。
blob_sizeof
: BLOB 列の 1 行のデータサイズをクエリします。この関数は、入力パラメータとして BLOB 列を必要とし、INTEGER 値を返します。次の例は、この関数の使用方法を示しています。
次のステートメントを実行して、
blob_sizeof
関数を使用して、c2 という名前の BLOB 列のデータサイズをクエリできます。SELECT blob_sizeof(c2) FROM testBlob WHERE p1 = 1;
blob_url
: BLOB 列の 1 行に格納されているデータをダウンロードできる URL を取得します。この関数は、入力パラメータとして BLOB 列を必要とし、VARCHAR 値を返します。次の例は、この関数の使用方法を示しています。
次のステートメントを実行して、
blob_url
関数を使用して、c2 という名前の BLOB 列に格納されているデータをダウンロードできる URL を取得できます。SELECT blob_url(c2) FROM testBlob WHERE p1 = 1;
説明この関数は、指定された BLOB 列に格納されているデータをダウンロードするために使用できる HTTP URL を返します。