BLOB(Binary Large Object)即二进制大对象,通常用于存储较大的二进制文件,例如音频、视频、图像等文件。Lindorm宽表SQL支持BLOB数据类型,使用时可以直接将Lindorm宽表中的一个非主键列的数据类型定义为BLOB类型。本文介绍如何使用Lindorm宽表的BLOB数据类型。

前提条件

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