在数据库的世界里,数据存储和管理是一项复杂而精细的工作。尤其是当我们涉及到大对象数据时,选择合适的字段类型对于性能和效率至关重要。本文我们将探讨数据库中的大对象字段类型——TEXT、CLOB、BYTE和BLOB,了解它们的特点、使用场景以及如何在实际应用中发挥它们的最大效用。
大对象字段类型的分类
⼤对象字段类型是为了存储超过32KB以上的数据⽽使⽤的字段类型。
数据在32KB到2GB之间,推荐使⽤简单大对象字段类型。
数据在2GB到4TB之间,推荐使⽤智能大字段类型 。
数据⼩于32KB的可以使⽤varchar类型,这个类型可以存储32KB以下的数据 。
由于三种字段类型的存储⽅式、检索⽅式都不⼀样,所以希望尽可能按照数据应⽤的⼤⼩选择应使⽤的类型,从⽽保证性能。
简单大对象text和byte
⼤字段数据分为两种:⽂本类型数据和二进制数据
文本类型数据:TEXT,适⽤于32KB到2GB的⽂本类型数据。TEXT 数据类型存储任何⽂本数据。TEXT 列通常存储备忘录、⼿册章节、商业⽂档、程序源⽂件和其他⽂本类信息。
二进制数据:BYTE,适⽤于32KB到2GB的⼆进制类型数据,存储⾳视频类型数据。
智能大对象clob和blob
智能⼤对象类型是在简单⼤对象类型之上做的延伸,是针对超过简单⼤对象类型存储上限的数据⽽延伸出来的字段类型,即超过2GB⼤⼩数据的数据⽽使⽤的字段类型。
文本类型数据:text可存储2GB以下的数据,超过这个⼤⼩则使⽤clob字段类型。
二进制类型数据:byte可存储2GB以下的⼆进制数据,超过这个⼤⼩则使⽤blob类型数据。
简单大对象和智能大对象在数据库端使用的比较
1、text和byte字段类型在数据库⼯具使⽤的缺点
text和byte字段类型⽆法使⽤insert语句在数据库⼯具中插⼊,需要使⽤load的⽅式。
text和byte在数据库端无法使⽤insert。
> create table test(id text,name byte);
Table created.
Elapsed time: 0.001 sec
> insert into test values('a','1');
617: A blob data type must be supplied within this context.
Error in line 1
Near character position 28
使⽤load语法插⼊简单⼤字段类型数据。
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ cat test
a|a1
b|b1
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ dbaccess test
Your evaluation license will expire on 2025-09-18 00:00:00
Database selected.
> load from 'test' delimiter '|' insert into test;
2 row(s) loaded.
Elapsed time: 0.002 sec
> select * from test;
id
a
name <BYTE value>
id
b
name <BYTE value>
2 row(s) retrieved.
load是从⽂件中加载数据,上述是从test⽂件中加载两⾏text和byte类型数据。
语法说明
load from '⽂件路径和⽂件' delimiter '分隔符,默认是|' insert into 表名;
2、智能大对象在数据库端的使用
blob和clob字段类型可以更换模式的情况下可以使⽤insert语句插⼊。
gbase8s在3.3.0之后数据库分为了两种模式,⼀种是默认的gbase模式,还有⼀种是oracle模式,⽽blob和clob在oracle模式的情况下可以在数据库端使⽤insert插⼊。
调整数据库模式可以使⽤insert插⼊。
> create table test1(id clob,name blob);
Table created.
Elapsed time: 0.002 sec
> set environment sqlmode 'oracle';
Environment set.
Elapsed time: 0.002 sec
> insert into test1 values('c','c1');
1 row(s) inserted.
Elapsed time: 0.008 sec
>
简单大对象和智能大对象在程序中的对比
1、简单大对象在程序中的使用
简单⼤对象在数据库端⽆法使⽤insert插⼊,但是可以在程序中使⽤insert的⽅式进⾏插⼊:text字段类型批量推荐⽅法如下:使⽤mybatis提供的ExecutorType.BATCH去实现批量插⼊。
部分代码如下:
InputStream inputStream = Resources.getResourceAsStream(resource);
sf = new SqlSessionFactoryBuilder().build(inputStream);
sqlsession = sf.openSession(ExecutorType.BATCH,false);
TableOneMapper tableOneMapper = sqlsession.getMapper(TableOneMapper.clas
s);
List<TableTwo> list =new ArrayList<>();
for (int i=1;i<= 20000;i++){
list.add(new TableTwo(i, UUID.randomUUID().toString(),UUID.randomUUID
().toString()));
}
long timeStamp1 = System.currentTimeMillis();
System.out.println("begin_time: "+timeStamp1);
list.stream().forEach(tableTwo -> tableOneMapper.instTab3(tableTwo));
long timeStamp2 = System.currentTimeMillis();
System.out.println("end_time: "+timeStamp2);
System.out.println(timeStamp2-timeStamp1);
sqlsession.commit();
sqlsession.close();----Mapper
如下
<insert id="instTab3" >
insert into tabletwo values(
#{
tableTwo.c1},#{
tableTwo.c2},#{
tableTwo.c3}
);
</insert>
处理逻辑就是不使⽤集合作为参数传递给foreach去拼接sql, ⽽是将单个对象传递给mapper接⼝,这样处理⼤⼤减少了客户端与数据库的通信次数,极⼤增加效率。
2、智能大对象在程序中的使用
⼀般⽅法使⽤智能⼤对象,先从缓冲中找到存储数据真实位置的⽂件描述符,再通过⽂件描述符去找到真实数据的位置,但是clob和blob字段类型的获取在⼤批量获取的时候,多并发获取⽂件描述符的时候会出现检索冲突或者返回结果为NULL的情况。
推荐方法:
如果数据真的超过2GB:
针对mybatis框架,由于默认情况下是通过获取描述符的⽅式去获取数据的,所以可以通过改变获取⽅式从⽽跳过⽂件描述符,如取消mybatis框架中的GET CLOB协议。
使⽤getstring的⽅式获取数据。
数据没有超过2GB
字符⽂本类型数据使⽤text类型。
⼆进制类型使⽤byte类型。
总之,大对象字段类型的选择和管理是数据库设计中的一个重要方面。通过了解TEXT、CLOB、BYTE和BLOB的特点和使用场景,我们可以更好地优化数据库性能,提高数据处理的效率。在实际应用中,我们应该根据数据的大小和特性,选择最合适的字段类型,以确保数据的高效存储和快速检索。