BLOB數(shù)據(jù)類型(邀測中)
BLOB(Binary Large Object)即二進制大對象,通常用于存儲較大的二進制文件,例如音頻、視頻、圖像等文件。Lindorm寬表SQL支持BLOB數(shù)據(jù)類型,使用時可以直接將Lindorm寬表中的一個非主鍵列的數(shù)據(jù)類型定義為BLOB類型。本文介紹如何使用Lindorm寬表的BLOB數(shù)據(jù)類型。
適用引擎
BLOB數(shù)據(jù)類型僅適用于寬表引擎。
前提條件
已開通S3存儲服務。開通方式,請參見開通S3協(xié)議兼容功能。
BLOB數(shù)據(jù)類型目前處于邀測階段,如有使用需求,請聯(lián)系Lindorm技術(shù)支持(釘釘號:s0s3eg3)申請使用名額。
注意事項
Lindorm寬表的主鍵列不支持BLOB數(shù)據(jù)類型。
DDL
您可以在創(chuàng)建表或修改表時,指定相關(guān)列的數(shù)據(jù)類型為BLOB。
執(zhí)行以下語句,創(chuàng)建表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。
執(zhí)行以下語句,在表中新增c3列并指定c3列為BLOB類型。
ALTER TABLE tb ADD COLUMN c3 BLOB;
重要增加列的語法,請參見ALTER TABLE。
寬表引擎2.6.4之前的版本,如果在建表時未設(shè)置BLOB列,那么通過
ALTER TABLE ADD COLUMN
添加的BLOB列將出現(xiàn)數(shù)據(jù)讀寫問題。建議您將寬表引擎升級至2.6.4及以上版本。如何查看或升級當前版本,請參見寬表引擎版本說明和升級小版本。寬表引擎2.6.4及以上版本,通過
ALTER TABLE ADD COLUMN
添加BLOB列時,系統(tǒng)默認以數(shù)據(jù)庫名和表名來拼接BLOB_BUCKET_NAME。如果拼接后的BLOB_BUCKET_NAME不滿足BUCKET命名規(guī)則,則該語句將報錯。此時您可以顯式自定義一個符合命名規(guī)則的BLOB_BUCKET_NAME,例如ALTER TABLE tb_name SET 'BLOB_BUCKET_NAME'='my-bucket-name';
。BUCKET命名規(guī)則請參見表屬性(table_options)。如果原表已設(shè)置BLOB_BUCKET_NAME屬性,請不要修改。您可以在集群管理系統(tǒng)的概覽頁面,單擊目標數(shù)據(jù)庫下的目標表名。在當前詳情表格區(qū)域,單擊查看表屬性,查看原表是否設(shè)置了BLOB_BUCKET_NAME屬性。如何進入集群管理系統(tǒng),請參見登錄集群管理系統(tǒng)。
DML
目前BLOB數(shù)據(jù)類型的DML操作僅支持Lindorm JDBC Driver方式。如何通過Lindorm JDBC Driver連接寬表引擎,請參見使用Java語言JDBC接口的應用開發(fā)。
數(shù)據(jù)寫入
BLOB列可通過PreparedStatement#setBlob(int parameterIndex, InputStream inputStream, long length)
方式綁定參數(shù)并寫入數(shù)據(jù)。inputStream
參數(shù)表示傳入InputStream對象,length
為InputStream對象中數(shù)據(jù)的大小。示例代碼如下:
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); //流寫B(tài)LOB數(shù)據(jù)
pStmt.executeUpdate();
}
數(shù)據(jù)讀取
Lindorm支持以下兩種方式讀取BLOB列的數(shù)據(jù):
方式一:一次性讀取一行數(shù)據(jù)中整個BLOB列的全部內(nèi)容,并保存至一個字節(jié)數(shù)組中。
//直接讀取整個BLOB列的完整內(nèi)容 ResultSet resultSet = stmt.executeQuery("select * from " + tableName + " where p1 = 1" ); byte[] readBytes2 = resultSet.getBytes(3);
方式二:獲取BLOB列中的InputStream對象進行讀取。
說明僅Lindorm JDBC Driver為2.1.3及以上版本時,可以通過該方式讀取數(shù)據(jù)。
如果需要在后續(xù)業(yè)務邏輯中進行流式處理,請選擇該方式。
//獲取BLOB列對應的InputStream對象進行讀取 ResultSet resultSet = stmt.executeQuery("select * from " + tableName + " where p1 = 1" ); Blob blob = resultSet.getBlob(3); InputStream inputStream = blob.getBinaryStream(); ....//應用從InputStream對象中獲取數(shù)據(jù),進行流式處理 blob.free(); //使用完成后需要釋放
函數(shù)說明
目前BLOB數(shù)據(jù)類型支持以下函數(shù),可用于SQL操作。
blob_sizeof
:獲取一行數(shù)據(jù)中指定BLOB列的大小。輸入值類型為BLOB,返回值類型為INTEGER。示例如下:
使用
blob_sizeof
函數(shù)獲取數(shù)據(jù)類型為BLOB,名為c2的列的大小。SELECT blob_sizeof(c2) FROM testBlob WHERE p1 = 1;
blob_url
:獲取一行數(shù)據(jù)中指定BLOB列的下載地址。輸入值類型為BLOB,返回值類型為VARCHAR。示例如下:
使用
blob_url
函數(shù)獲取數(shù)據(jù)類型為BLOB,名為c2的列的下載地址。SELECT blob_url(c2) FROM testBlob WHERE p1 = 1;
說明返回結(jié)果為HTTP地址,可以通過這個地址下載BLOB列。