BLOB(Binary Large Object)即二進位大對象,通常用於儲存較大的二進位檔案,例如音頻、視頻、映像等檔案。Lindorm寬表SQL支援BLOB資料類型,使用時可以直接將Lindorm寬表中的一個非主鍵列的資料類型定義為BLOB類型。本文介紹如何使用Lindorm寬表的BLOB資料類型。
適用引擎
BLOB資料類型僅適用於寬表引擎。
前提條件
已開通S3儲存服務。開通方式,請參見開通S3協議相容功能。
BLOB資料類型目前處於邀測階段,如有使用需求,請聯絡Lindorm支援人員(DingTalk號:s0s3eg3)申請使用名額。
注意事項
Lindorm寬表的主鍵列不支援BLOB資料類型。
DDL
您可以在建立表或修改表時,指定相關列的資料類型為BLOB。
執行以下語句,建立表tb並指定p1為主鍵列且類型為INT,c1列和c2列為非主鍵列,且類型分別為VARCHAR和BLOB。
CREATE TABLE tb (p1 INT, c1 VARCHAR, c2 BLOB, PRIMARY KEY(p1));說明如果表名中需要包含底線(_)等特殊字元,請在建表時指定BLOB_BUCKET_NAME屬性。BLOB_BUCKET_NAME屬性的詳細介紹,請參見表屬性(table_options)。
建表文法,請參見CREATE TABLE。
執行以下語句,在表中新增c3列並指定c3列為BLOB類型。
ALTER TABLE tb ADD COLUMN c3 BLOB;重要增加列的文法,請參見ALTER TABLE。
寬表引擎2.6.4之前的版本,如果在建表時未設定BLOB列,那麼通過
ALTER TABLE ADD COLUMN添加的BLOB列將出現資料讀寫問題。建議您將寬表引擎升級至2.6.4及以上版本。如何查看或升級目前的版本,請參見寬表引擎版本說明和升級小版本。寬表引擎2.6.4及以上版本,通過
ALTER TABLE ADD COLUMN添加BLOB列時,系統預設以資料庫名和表名來拼接BLOB_BUCKET_NAME。如果拼接後的BLOB_BUCKET_NAME不滿足BUCKET命名規則,則該語句將報錯。此時您可以顯式自訂一個符合命名規則的BLOB_BUCKET_NAME,例如ALTER TABLE tb_name SET 'BLOB_BUCKET_NAME'='my-bucket-name';。BUCKET命名規則請參見表屬性(table_options)。如果原表已設定BLOB_BUCKET_NAME屬性,請不要修改。您可以在叢集管理系統的概覽頁面,單擊目標資料庫下的目標表名。在當前詳情表格地區,單擊查看錶屬性,查看原表是否設定了BLOB_BUCKET_NAME屬性。如何進入叢集管理系統,請參見登入叢集管理系統。
DML
目前BLOB資料類型的DML操作僅支援Lindorm JDBC Driver方式。如何通過Lindorm JDBC Driver串連寬表引擎,請參見使用Java語言JDBC介面的應用開發。
資料寫入
BLOB列可通過PreparedStatement#setBlob(int parameterIndex, InputStream inputStream, long length)方式綁定參數並寫入資料。inputStream參數表示傳入InputStream對象,length為InputStream對象中資料的大小。範例程式碼如下:
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();
}資料讀取
Lindorm支援以下兩種方式讀取BLOB列的資料:
方式一:一次性讀取一行資料中整個BLOB列的全部內容,並儲存至一個位元組數組中。
//直接讀取整個BLOB列的完整內容 ResultSet resultSet = stmt.executeQuery("select * from " + tableName + " where p1 = 1" ); byte[] readBytes2 = resultSet.getBytes(3);方式二:擷取BLOB列中的InputStream對象進行讀取。
說明僅Lindorm JDBC Driver為2.1.3及以上版本時,可以通過該方式讀取資料。
如果需要在後續商務邏輯中進行串流,請選擇該方式。
//擷取BLOB列對應的InputStream對象進行讀取 ResultSet resultSet = stmt.executeQuery("select * from " + tableName + " where p1 = 1" ); Blob blob = resultSet.getBlob(3); InputStream inputStream = blob.getBinaryStream(); ....//應用從InputStream對象中擷取資料,進行串流 blob.free(); //使用完成後需要釋放
函數說明
目前BLOB資料類型支援以下函數,可用於SQL操作。
blob_sizeof:擷取一行資料中指定BLOB列的大小。輸入實值型別為BLOB,傳回值類型為INTEGER。樣本如下:
使用
blob_sizeof函數擷取資料類型為BLOB,名為c2的列的大小。SELECT blob_sizeof(c2) FROM testBlob WHERE p1 = 1;blob_url:擷取一行資料中指定BLOB列的下載地址。輸入實值型別為BLOB,傳回值類型為VARCHAR。樣本如下:
使用
blob_url函數擷取資料類型為BLOB,名為c2的列的下載地址。SELECT blob_url(c2) FROM testBlob WHERE p1 = 1;說明返回結果為HTTP地址,可以通過這個地址下載BLOB列。