[20171218]varchar2(4000)如何保存.txt
[20171218]varchar2(4000)如何保存.txt
--//以前写的,不知道为什么被删除了,现在补上.
如果一行能被存储于一个数据块(data block)中,那么其行头(row header)所需容量将不少于 3 字节(byte)。在行头信息之后依次
储存的是各列的列长(column length)及列值(column value)。列长存储于列值之前,如列值不超过250 字节,那么 Oracle使用1字节存
储其列长;如列值超过 250 字节,则使用 3 字节存储其列长。列数据(column data)所需的存储空间取决于此列的数据类型(datatype)。
如果某列的数据类型为变长(variable length)的,那么存储此列值所需的空间可能会随着数据更新而增长或缩小。
--//测试看看oracle如何存储列值超过250字节的.
1.建立测试:
SCOTT@book> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SCOTT@book> create table t1(v1 varchar2(4000));
Table created.
insert into t1 values(rpad('1',250,'A'));
insert into t1 values(rpad('2',251,'B'));
insert into t1 values(rpad('2',4000,'C'));
commit ;
SCOTT@book> select rowid,substr(v1,1,2) from t1;
ROWID SUBS
------------------ ----
AAAWJvAAEAAAAIkAAA 1A
AAAWJvAAEAAAAIkAAB 2B
AAAWJvAAEAAAAIkAAC 2C
SCOTT@book> @ &r/rowid AAAWJvAAEAAAAIkAAA
OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
90735 4 548 0 0x1000224 4,548 alter system dump datafile 4 block 548 ;
SCOTT@book> alter system checkpoint;
System altered.
2.使用bbed查看:
BBED> set dba 4,548
DBA 0x01000224 (16777764 4,548)
BBED> x /rc *kdbr[0]
rowdata[4263] @7934
-------------
flag@7934: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@7935: 0x01
cols@7936: 1
col 0[250] @7937: 1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...(太长,截去)
BBED> dump /v count 64
File: /mnt/ramdisk/book/users01.dbf (4)
Block: 548 Offsets: 7934 to 7997 Dba:0x01000224
-----------------------------------------------------------------------------------------------------------
2c0101fa 31414141 41414141 41414141 41414141 41414141 41414141 41414141 l ,...1AAAAAAAAAAAAAAAAAAAAAAAAAAA
41414141 41414141 41414141 41414141 41414141 41414141 41414141 41414141 l AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
<32 bytes per line>
--//2c 表示flag,01 表示lock ,01 表示 cols. 0xfa= 250.长度<=250,Oracle使用1字节存储其列长.继续看下面的记录:
BBED> x /rc *kdbr[1]
rowdata[4006] @7677
-------------
flag@7677: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@7678: 0x01
cols@7679: 1
col 0[251] @7680: 2BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ...(snip..)
BBED> dump /v count 64
File: /mnt/ramdisk/book/users01.dbf (4)
Block: 548 Offsets: 7677 to 7740 Dba:0x01000224
-----------------------------------------------------------------------------------------------------------
2c0101fe fb003242 42424242 42424242 42424242 42424242 42424242 42424242 l ,.....2BBBBBBBBBBBBBBBBBBBBBBBBB
42424242 42424242 42424242 42424242 42424242 42424242 42424242 42424242 l BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
<32 bytes per line>
--//前面2c0101 不再描述.0xfe=254 ,使用fe表示超过长度250. 后面0x00fb(倒过来)=251表示字符串长度.继续看:
BBED> x /rc *kdbr[2]
rowdata[0] @3671
----------
flag@3671: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@3672: 0x01
cols@3673: 1
col 0[4000] @3674: 2CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.... (snip)
BBED> dump /v count 64
File: /mnt/ramdisk/book/users01.dbf (4)
Block: 548 Offsets: 3671 to 3734 Dba:0x01000224
-----------------------------------------------------------------------------------------------------------
2c0101fe a00f3243 43434343 43434343 43434343 43434343 43434343 43434343 l ,.....2CCCCCCCCCCCCCCCCCCCCCCCCC
43434343 43434343 43434343 43434343 43434343 43434343 43434343 43434343 l CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
<32 bytes per line>
--//0xfe=254 ,使用fe表示超过长度250. 后面0x0fa0(倒过来)=4000,表示字符串长度.
SCOTT@book> @ &r/16to10 0fa0
16 to 10 DEC
------------
4000
总结:
1.如果列值长度小于等于250字节,Oracle使用1字节存储其列长.内容为字段的长度.
2.如果列值长度超过250字节,则使用3字节存储其列长。前面1个字节使用0xfe(表示超过250),后面2个字节表示列值长度.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库