li
  当前位置:主页 > 性能优化 > 文章内容
li
Oracle基本数据类型存储格式浅析(一)——字符类型
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:3  
本文章共2222字,分2页,当前第1页,快速翻页:
 

前一阵看完文档,对oracle的基本数据类型的存储格式有了一些了解,最近有做了一些测试进行了验证。

打算整理总结一下,这一篇主要说明字符类型的存储格式。主要包括char、varchar2和long等几种类型。


SQL> create table test_char (char_col char(10), varchar_col varchar2(10), long_col long);

表已创建。

SQL> insert into test_char values ('abc', '123', ',fd');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select rowid from test_char;

ROWID
------------------
AAAB3LAAFAAAAAgAAA

根据rowid的定义规则,第7~9位是表示的是数据文件,F表示5,而10~15位表示的是在这个数据文件中的第几个BLOCK,g表示32。(rowid编码相当于64进制。用A~Z a~z 0~9 /共64个字符表示。A表示0,B表示1,……,a表示26,……,0表示52,……, 表示62,/表示63。)

我们根据计算的结果去dump这个block。

SQL> ALTER SYSTEM DUMP DATAFILE 5 BLOCK 32;

系统已更改。

打开产生的trace文件:

data_block_dump,data header at 0x3421064
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x03421064
bdba: 0x01400020
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f82
avsp=0x1f6e
tosp=0x1f6e
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f82
block_row_dump:
tab 0, row 0, @0x1f82
tl: 22 fb: --H-FL-- lb: 0x1 cc: 3
col 0: [10] 61 62 63 20 20 20 20 20 20 20

col 1: [ 3] 31 32 33
IXDBA.NET社区论坛
col 2: [ 3] 2c 66 64
end_of_block_dump
End dump data blocks tsn: 5 file#: 5 minblk 32 maxblk 32

观察dump出来的结果,可以发现以下几点:

1.对于每个字段,除了保存字段的值以外,还会保存当前字段中数据的长度。而且,oracle显然没有把字段的长度定义或类型定义保存在block中,这些信息保存在oracle的数据字典里面。

2. 根据dump的结果,可以清楚的看到,字符类型在数据库中是以ascii格式存储的。

SQL> select chr(to_number('61', 'xx')) from dual;

CH
--
a

3.char类型为定长格式,存储的时候会在字符串后面填补空格,而varchar2和long类型都是变长的。

SQL> SELECT DUMP(CHAR_COL, 16) D_CHAR FROM TEST_CHAR;

D_CHAR
-------------------------------------------------------------
Typ=96 Len=10: 61,62,63,20,20,20,20,20,20,20

SQL> SELECT DUMP(VARCHAR_COL, 16) D_VARCHAR2 FROM TEST_CHAR;

D_VARCHAR2
-------------------------------------------------------------
Typ=1 Len=3: 31,32,33

SQL> SELECT DUMP(LONG_COL, 16) D_VARCHAR2 FROM TEST_CHAR;
SELECT DUMP(LONG_COL, 16) D_VARCHAR2 FROM TEST_CHAR
*
ERROR 位于第 1 行:
ORA-00997: 非法使用 LONG 数据类型

由于DUMP不支持LONG类型,因此我们使用了alter system dump block的方式,通过比较两种方式得到的结果,发现DUMP()函数不但方便,结果清晰,而且指出了进行DUMP的数据类型,在以后的例子中,除非必要的情况,否则都会采用DUMP()函数的方式进行说明。

下面看一下插入中文的情况,首先看一下数据库的字符集

SQL> select name, value$ from sys.props$ where name like '%CHARACTERSET%';

NAME VALUE$
------------------------------ ------------------------------
NLS_CHARACTERSET ZHS16GBK
NLS_NCHAR_CHARACTERSET AL16UTF16

SQL> insert into test_char values ('定长', '变长', null);

已创建 1 行。

SQL> SELECT DUMP(CHAR_COL, 16) D_CHAR FROM TEST_CHAR;

D_CHAR
----------------------------------------------------------------
Typ=96 Len=10: 61,62,63,20,20,20,20,20,20,20
Typ=96 Len=10: b6,a8,b3,a4,20,20,20,20,20,20

SQL> SELECT DUMP(VARCHAR_COL, 16) D_VARCHAR2 FROM TEST_CHAR;



阅读更多内容1 · 2 · 下一页>>


  上一篇: 物化视图的快速刷新(一)   下一篇: 全文索引文档显示——标注
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·物化视图的快速刷新(一)
·清除auto.exe病毒
·RMAN-6172错误
·Oracle分页查询语句(一)
·Oracle CAST函数不生效
·物化视图日志结构
·DIM-00003错误
·减少全库导入时发生的错误(一)
·Oracle11新特性——备份恢复功能...
·安装ORACLE10201 for REDHAT AS4...
·全文索引文档显示——标注
·将普通表转变为分区表
·物化视图——数据仓库手册
·TO_DATE函数的小问题
·管理分区表和索引——管理员手册
·从PUBLIC回收SELECT ANY TABLE权...
·Oracle如何根据物化视图日志快速...
·数据字典——数据库概念
·物化视图的快速刷新(三)
·Oracle基本数据类型存储格式浅析...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接