[20171218]varchar2(4000)如何保存.txt

简介: varchar2(4000)如何保存
[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个字节表示列值长度.


目录
相关文章
|
Oracle 关系型数据库 测试技术
[20180416]clob的插入.txt
[20180416]clob的插入.txt --//论坛上有人问的问题,如何限制BLOB字段的大小,用户只能上传15K至30K的图片,超过30K就不给上传. --//链接:http://www.
1079 0
|
SQL Oracle 关系型数据库
[20180415]blob的插入.txt
[20180415]blob的插入.txt --//论坛上有人问的问题,如何限制BLOB字段的大小,用户只能上传15K至30K的图片,超过30K就不给上传. --//链接:http://www.
1110 0
|
Oracle 关系型数据库 OLAP
[20170315]11.2.0.4 exp可以导出空表.txt
[20170315]11.2.0.4 exp可以导出空表.txt --链接http://www.itpub.net/thread-2084282-1-1.html,11.
1188 0
|
SQL Shell 测试技术
[20161023]为什么以前可以这样的表.txt
[20161023]为什么以前可以这样的表.txt --上午看https://oracleblog.org/working-case/ora-01401-impdp-same-character/ CREATE TABLE ASS_ACC...
790 0
|
Oracle 关系型数据库 开发工具
[20161020]bbed保存执行结果.txt
[20161020]bbed保存执行结果.txt --别人问的问题,实际上如果输出内容不多,直接界面上查看。 --如果输出很多,屏幕显示一闪而过,如果在tmux下使用就很简单,使用前缀键+[进入tmux的buffer模式,浏览以前的显示的内容 --我设置vi模式,可以像vim使用?或者/查询需要找的内容,一般使用?,因为tmux的显示是从下向上的。
761 0
[20151119]nvarchar2类型.txt
[20151119]nvarchar2类型.txt -- 前几天帮别人看awr报表,连接如下:http://www.itpub.net/thread-1942785-1-1.html -- 最终确定是使用navrchar2存在隐式转换,实际上如果应用没有国际化需求,不要使用这个类型,通过一些例子来说明问题。
1029 0
|
SQL Oracle 关系型数据库
[20150901]提示USE_CONCAT.txt
[20150901]提示USE_CONCAT.txt --最近一直在使用这个提示USE_CONCAT ,开发真的不要这样写代码,应该分开写,这样的sql技巧真的不能乱用!分开写对应的sql语句优 --化选择索引的建立更方便一些。
818 0
|
索引
[20150814]使用use_concat提示.txt
[20150814]使用use_concat提示.txt SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ---------------------------...
957 0
|
SQL 索引
[20150705]使用use_concat提示.txt
[20150703]使用use_concat提示.txt --生产系统有一条sql语句遇到性能问题,由于生产系统语句非常复杂,我拿测试用户scott的表作为例子来说明: 1.
840 0
|
Oracle 关系型数据库 测试技术
[20150314]256列.txt
[20150314]256列.txt --oracle 当1个表超过256列时,要分成几个行片(row pieces),昨天看链接: https://jonathanlewis.
839 0