• [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个字节表示列值长度.


  • 相关阅读:
    等差子序列(sequence)
    威士忌(whiskey)
    图论:2-SAT模板
    poj2723-Get Luffy Out
    acdream1412:2-3 trees 组合数dp
    hdu3849-By Recognizing These Guys, We Find Social Networks Useful:双连通分量
    ZOJ2317-Nice Patterns Strike Back:矩阵快速幂,高精度
    ZOJ3519-Beautiful People:最长上升子序列的变形
    hdu2460-Network:边的双连通分量
    hdu4405:概率dp
  • 原文地址:https://www.cnblogs.com/lfree/p/8057828.html
Copyright © 2020-2023  润新知