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列。