VastbaseE100

基于开源技术的HTAP数据库管理系统。性能优异,稳定可靠,提供诸多专属领域特性。

Menu

处理大数据类型

二进制类型

Vastbase E100提供两种不同的方法存储二进制数据。二进制数据可以使用二进制数据类型BYTEA存储在表中,或者使用大对象特性以一种特殊的格式将二进制数据存储在一个独立的表中,然后通过在表中保存一个类型为 OID 的值来引用该表。

为了判断哪种方法比较合适,必须理解每种方法的局限。 BYTEA数据类型并不适合存储非常大数量的二进制数据。虽然类型为BYTEA的字段可以存储最多 1G 字节的二进制数据,但是这样它会要求巨大的内存(RAM)来处理这样巨大的数据。用于存储二进制数据的大对象方法更适合存储非常大的数据,但也有自己的局限,具体来说,删除一个引用大数据的行时并不会删除大对象,删除大对象需要单独操作。大对象还有一些安全性的问题,因为连接到数据库的任何用户都可以查看或修改任何大对象,即使他们没有权限查看或修改包含大对象引用的行。

BYTEA

使用BYTEA类型存储二进制数据,例如:

CREATE TABLE lo_test_tab (id int, img bytea);

插入记录

/*二进制数据*/
char param1[20] = { 1, 2, 3, 4, 5, 6, 7, 8 };
SQLLEN cbParam1;
/*分配语句句柄*/
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
if (!SQL_SUCCEEDED(rc))
{
	printf("failed to allocate stmt handle");
	exit(1);
}
/*预编译SQL*/
rc = SQLPrepare(hstmt, (SQLCHAR *) "INSERT INTO lo_test_tab VALUES (1, ?)", SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLPrepare failed", hstmt);
/*绑定参数*/
cbParam1 = 8;
rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT,
		SQL_C_BINARY,	/* value type */
		SQL_LONGVARBINARY,	/* param type */
		200,			/* column size */
		0,			/* dec digits */
		param1,		/* param value ptr */
		0,			/* buffer len */
		&cbParam1		/* StrLen_or_IndPtr */);
CHECK_STMT_RESULT(rc, "SQLBindParameter failed", hstmt);

/* 执行*/
rc = SQLExecute(hstmt);
CHECK_STMT_RESULT(rc, "SQLExecute failed", hstmt);

在这里,SQLBindParameter时指定参数类型为SQL_LONGVARBINARY,再将参数值的指针(char *类型)传入函数,即可将二进制数据写入。

读取记录

char buf[100];
SQLLEN ind;
/*分配句柄*/
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
/*执行查询*/
SQLExecDirect(hstmt, (SQLCHAR *) "SELECT id, img FROM lo_test_tab WHERE id = 1", SQL_NTS);
/*获取结果*/
rc = SQLFetch(hstmt);
CHECK_STMT_RESULT(rc, "SQLFetch failed", hstmt);
/*读取数据*/
rc = SQLGetData(hstmt, 2, SQL_C_BINARY, buf, sizeof(buf), &ind);
CHECK_STMT_RESULT(rc, "SQLGetData failed", hstmt);

字符串类型

Vastbase E100中TEXT类型与VARCHAR类型都是可变长的字符串类型,区别在于VARCHAR类型通过VARCHAR(n)中的n来限制最大长度,而TEXT类型没有。TEXT类型与VARCHAR类型几乎没有性能差别,TEXT类型最多可存储1G数据。

使用TEXT类型存储数据时,可用getString(),getCharacterStream(),setString(), setCharacterStream()来进行读写。

例如:

CREATE TABLE images (id int, msg text);

插入记录

str=”text value for test”;
SQLLEN cbParam1 = SQL_NTS;
/*分配语句句柄*/
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
if (!SQL_SUCCEEDED(rc))
{
	printf("failed to allocate stmt handle");
	exit(1);
}
/*预编译SQL*/
rc = SQLPrepare(hstmt, (SQLCHAR *) "INSERT INTO images  VALUES (1, ?)", SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLPrepare failed", hstmt);
/*绑定参数*/
cbParam1 = 8;
rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT,
		SQL_C_CHAR,	/* value type */
		SQL_CHAR,	/* param type */
		200,			/* column size */
		0,			/* dec digits */
		str,		/* param value ptr */
		0,			/* buffer len */
		&cbParam1		/* StrLen_or_IndPtr */);
CHECK_STMT_RESULT(rc, "SQLBindParameter failed", hstmt);

/* 执行*/
rc = SQLExecute(hstmt);
CHECK_STMT_RESULT(rc, "SQLExecute failed", hstmt);

读取记录

char buf[100];
SQLLEN ind;
/*分配句柄*/
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
/*执行查询*/
SQLExecDirect(hstmt, (SQLCHAR *) "SELECT id, img FROM images  WHERE id = 1", SQL_NTS);
/*获取结果*/
rc = SQLFetch(hstmt);
CHECK_STMT_RESULT(rc, "SQLFetch failed", hstmt);
/*读取数据*/
rc = SQLGetData(hstmt, 2, SQL_C_CHAR, buf, sizeof(buf), &ind);
CHECK_STMT_RESULT(rc, "SQLGetData failed", hstmt);