BLOB(Binary Large Object)即二进制大对象,通常用于存储较大的二进制文件,例如音频、视频、图像等文件。Lindorm宽表SQL支持BLOB数据类型,使用时可以直接将Lindorm宽表中的一个非主键列的数据类型定义为BLOB类型。本文介绍如何使用Lindorm宽表的BLOB数据类型。
前提条件
- 宽表引擎为2.4.1及以上版本。如何查看或升级当前版本,请参见宽表引擎版本说明和升级小版本。
- 已开通S3存储服务。开通方式,请参见开通S3协议兼容功能。
重要 BLOB数据类型目前处于邀测阶段,如有使用需求,请联系Lindorm技术支持(钉钉号:s0s3eg3)申请使用名额。
注意事项
Lindorm宽表的主键列不支持BLOB数据类型。
DDL
您可以在创建表或修改表时,指定相关列的数据类型为BLOB。
- 执行以下语句,创建表tb并指定p1为主键列且类型为INT,c1列和c2列为非主键列,且类型分别为VARCHAR和BLOB。
CREATE TABLE tb (p1 INT, c1 VARCHAR, c2 BLOB, PRIMARY KEY(p1));
说明 建表语法,请参见CREATE TABLE。 - 执行以下语句,在表中新增c3列并指定c3列为BLOB类型。
ALTER TABLE tb ADD c3 BLOB;
说明 增加列的语法,请参见ALTER TABLE。
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列。