探究oracle clob字段是如何存储的

clob字段存储的是文本,如果存储少于4000个字节则clob字段会和记录存放在一起,如果存储超过4000个字节,则不会与记录存放在一起。值得注意的是,这里的4000个字节并不是等同于varchar2(4000),那相当于什么呢,请看下列实验,数据库版本是10.2.0.1.0:

drop table test_clob purge;

create table test_clob

(

id number,

clob1  clob

);

insert into test_clob values(1,Lpad(‘111‘,100,‘1‘));--236

insert into test_clob values(2,Lpad(‘222‘,500,‘1‘));--1036

insert into test_clob values(3,Lpad(‘333‘,1000,‘1‘));--2036

insert into test_clob values(4,Lpad(‘444‘,1982,‘1‘));--4000

insert into test_clob values(5,Lpad(‘555‘,1983,‘1‘));--4002

commit;

select rowid,

dbms_rowid.rowid_object(rowid) object_id,

dbms_rowid.rowid_relative_fno(rowid) file_id,

dbms_rowid.rowid_block_number(rowid) block_id,

dbms_rowid.rowid_row_number(rowid) num

from test_clob;

ROWID               OBJECT_ID    FILE_ID   BLOCK_ID        NUM

------------------ ---------- ---------- ---------- ----------

AAAYQbAAFAADRpcAAA      99355          5     858716          0

AAAYQbAAFAADRpcAAB      99355          5     858716          1

AAAYQbAAFAADRpcAAC      99355          5     858716          2

AAAYQbAAFAADRpdAAA      99355          5     858717          0

AAAYQbAAFAADRpgAAA      99355          5     858720          0

alter system dump datafile 5 block 858716;

alter system dump datafile 5 block 858717;

alter system dump datafile 5 block 858720;

查看dump文件可以看到:

col  0: [ 2]  c1 02  --记录id=1  
为啥是1 请看我以前的帖子:http://blog.csdn.net/stevendbaguo/article/details/8010105

col  1: [236]

00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 02 1a 85 00 d8 09 00 00

00 00 00 00 c8 00 00 00 00 00 01 00 31 00 31 00 31 00 31 00 31 00 31 00 31

...........................................................................

...........................................................................

col  0: [ 2]  c1 03   --记录id=2

col  1: [1036]

00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 02 1a 86 03 f8 09 00 00

00 00 00 03 e8 00 00 00 00 00 01 00 31 00 31 00 31 00 31 00 31 00 31 00 31

...........................................................................

...........................................................................

col  0: [ 2]  c1 04   --记录id=3

col  1: [2036]

00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 02 1a 87 07 e0 09 00 00

00 00 00 07 d0 00 00 00 00 00 01 00 31 00 31 00 31 00 31 00 31 00 31 00 31

...........................................................................

...........................................................................

col  0: [ 2]  c1 05   --记录id=4

col  1: [4000]

00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 02 1a 88 0f 8c 09 00 00

00 00 00 0f 7c 00 00 00 00 00 01 00 31 00 31 00 31 00 31 00 31 00 31 00 31

...........................................................................

...........................................................................

col  0: [ 2]  c1 06   --记录id=5

col  1: [40]

00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 02 1a 89 00 14 05 00 00

00 00 00 0f 7e 00 00 00 00 00 02 01 4d 98 ac

记录 Lpad(‘111‘,100,‘1‘));--236

记录 Lpad(‘222‘,500,‘1‘)--1036

记录 Lpad(‘333‘,1000,‘1‘)--2036

记录 Lpad(‘444‘,1982,‘1‘)--4000

记录 Lpad(‘555‘,1983,‘1‘)--4002

看出规律来了,第一条记录我们认为的长度是100,存在block中的长度是236,就是236=100*2+36,其他的规律都是这样。同时也可以看到存储超过4000个字节,就是长度为1982时这个就是临界值,大于这个之后就clob就存到其他地方了。

探究oracle clob字段是如何存储的

时间: 2024-08-22 02:04:32

探究oracle clob字段是如何存储的的相关文章

java oracle clob string 大字符串存储【转】

单位用到了oracle存储string类型到数据库里的clob,上网查看资料找到解决方案.如下: 1 public class ClobTest { 2 3 static String url = "jdbc:oracle:thin:@10.12.10.18:1521:orcl"; 4 static String user = "cwbe1_9999"; 5 static String pwd = "or777"; 6 static String

解决Oracle clob字段数据过大问题

1 select * from user_lobs where table_name='WX_MAIL';--SYS_LOB0001313121C00015$$ 2 SELECT segment_name AS TABLENAME,BYTES/1024/1024 MB FROM user_segments WHERE segment_name='SYS_LOB0001313121C00015$$'; WX_MAIL有一个content字段为clob类型,保存了邮件的内容,导致数据过大,平均每个c

oracle clob字段去除html标签

通过正则表达式的方式去除html标签 [html] view plain copy select regexp_replace(content,'</?[^>]*>|nbsp;|&','') content from T_TEST_CONTENT_CONFIG t order by status_date desc; 原始clob内容: <p><spanstyle="font-family:宋体;">[某某公司]您有一条XX尚未领取!使

Java 存储和读取 oracle CLOB 类型字段的实用方法

package oracle.clob; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.sql.Connection; import java.sql.DriverManager; import java

oracle大字段类型clob和glob备忘

BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的的,或者可以直接用LOB字段代替这两个.但是为了更好的管理ORACLE数据库,通常像图片.文件.音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去.而像文章或者是较长的文字,就用CLOB存储,这样对以后的查询更新存储等操作都提供很大的方便.

【Oracle】【35】BLOB字段和CLOB字段

前言: BLOB用来存储大量二进制数据.如图片.音乐等,转为二进制数再存储 CLOB用来存储大量文本数据.如HTML页面等,varchar2最大是4000,预计会超过4000的用Clob 正文: 1,我用的是java + mybatis,直接用String处理就可以了.String最大能存4G 数据库:创建表 -- Create table create table CLOB_TEST ( id VARCHAR2(32) default sys_guid(), content CLOB ) 实体

【Oracle】给clob字段插入数据

// 插入 //OracleCommand cmd = "insertInto into GIS_PolygonPoint(PCode,PointColl) values('140134', :var)"; // 修改 //OracleCommand cmd = new OracleCommand("update yd_line set coord=:coordstr where lineid=" + LineId.ToString(), conn); string

Oracle中的BLOB和CLOB字段类型的区别

1.BLOB是按二进制来存储的,而CLOB是可以直接存储文字的: 2.BLOB字段可以存储图片.文件和音乐等,而CLOB可以存储文章或较长文字的内容.

解决比较Oracle中CLOB字段问题

解决比较Oracle中CLOB字段问题 Oracle中CLOB和BLOB字段虽说在开发中满足了存放超大内容的要求,但是在一些简单使用中确频频带来麻烦.CLOB中存放的是指针,并不能直接取到实际值.而SQLServer中的text字段就很方便,可以直接拿来与需要的字符串比对,象什么等于呀小于呀Like呀不在话下.可是换成Oracle就麻烦死了,要开辟一个缓存,把内容一段段读取出来后转换,难道写个where条件都这么复杂?经过多方寻求资料,终于发现一个方便简单的方法:利用dbms_lob 包中的方法