天极Yesky
  • 笔记本电脑
    笔记本
  • 台式电脑
    台式机
  • 手机
    手机
  • 电脑硬件DIY
    DIY硬件
  • CPU
    主板
    音箱
  • 硬盘
    显卡
    键鼠
  • 内存光驱
    显示器
    机箱电源

  • 数码相机DC
    数码相机
  • MP3播放器
    MP3/MP4
  • 数码摄像机DV
    摄像机
  • 电脑外设
    外设
  • 网络
    网络
  • 服务器
    服务器
  • 数字家庭
    数字家庭
  • 群乐
    群乐
  • 产品报价 行情 经销商 渠道 评测 | 软件 设计 网页 开发 安全 论坛 E时代 游戏 图片 壁纸 下载 网摘 博客 索尼专区 Vista 科技奥运
    天极网
    Oracle基本数据类型存储格式浅析(一)——字符类型
    作者:
    出处: http://blog.itpub.net/post/468/9287
    责任编辑: 武扬
    [ 2005-01-26 17:05 ]



      前一阵看完文档,对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
    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 数据类型

    共2页。 1 2 :
    笔名:
    请您注意:

     遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

     天极网拥有管理笔名和留言的一切权利。