[20160619]NULL在数据库的存储.txt

[20160619]NULL在数据库的存储.txt

--简单探究NULL在数据库的存储.这也是别人前几天问的问题,我自己学习oracle这么久,也没有仔细观察过.

1.环境:
SCOTT@test01p> @ ver1

PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

create table t (a number,b number , c number , d number );
insert into t values (1,NULL,NULL,NULL);
insert into t values (2,NULL,2,2);
commit ;
alter system checkpoint ;

2.测试:

SCOTT@test01p> select rowid,t.* from t;
ROWID                       A          B          C          D
------------------ ---------- ---------- ---------- ----------
AAAZpSAAJAAAACNAAA          1
AAAZpSAAJAAAACNAAB          2                     2          2

SCOTT@test01p> @ rowid AAAZpSAAJAAAACNAAA
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
    105042          9        141          0 9,141                alter system dump datafile 9 block 141 ;

SCOTT@test01p> alter system dump datafile 9 block 141 ;
System altered.

data_block_dump,data header at 0xa7e8264
===============
tsiz: 0x1f98
hsiz: 0x16
pbl: 0x0a7e8264
     76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1f85
avsp=0x1f6c
tosp=0x1f6c
0xe:pti[0]    nrow=2    offs=0
0x12:pri[0]    offs=0x1f92
0x14:pri[1]    offs=0x1f85
block_row_dump:
tab 0, row 0, @0x1f92
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f85
tl: 13 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 03
col  1: *NULL*
col  2: [ 2]  c1 03
col  3: [ 2]  c1 03
end_of_block_dump
End dump data blocks tsn: 3 file#: 9 minblk 141 maxblk 141

--从转储可以发现如果插入NULL在后面的字段,oracle是不保存的.可以发现col  1: *NULL* ,但是具体数值是多少呢?从这里看不出来.
--最简单的方法是通过bbed观察:

BBED> set dba 9,142
        DBA             0x0240008e (37748878 9,142)

--注:我在windows下使用bbed存在1个数据块的偏移.
BBED> p *kdbr[1]
rowdata[0]
----------
ub1 rowdata[0]                              @8169     0x2c

BBED> x /r
rowdata[0]                                  @8169
----------
flag@8169: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8170: 0x01
cols@8171:    4

col    0[2] @8172:  0xc1  0x03
col    1[0] @8175: *NULL*
col    2[2] @8176:  0xc1  0x03
col    3[2] @8179:  0xc1  0x03

--可以col    1[0] @8175: *NULL*,里面的长度是0,也就是NULL不占用空间,但是长度指示器保存的是0.但是如果使用dump观察:

BBED> set count 32
        COUNT           32

BBED> dump /v
File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\SAMPLE_SCHEMA_USERS01.DBF (9)
Block: 142                                            Offsets: 8169 to 8191     Dba:0x0240008e
------------------------------------------------------------------------------------------------------
2c010402 c103ff02 c10302c1 032c0101 02c10201 06b8b0                             l ,...?..?.?,...?..赴
              ~~   
<48 bytes per line>
--注意看~部分.

BBED> set count 1
        COUNT           1

BBED> dump /v offset 8175
File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\SAMPLE_SCHEMA_USERS01.DBF (9)
Block: 142                                           Offsets: 8175 to 8175      Dba:0x0240008e
-----------------------------------------------------------------------------------------------------
ff                                                                              l .
<48 bytes per line>

--可以发现实际上NULL在oracle数据库使用0xff表示.没有长度指示器.
--也就是在rowdata中长度指示器等于0xff,就表示长度=0,内容是NULL.

--也可以参考我以前写的blog,链接如下:

[20121026]varchar2(4000)如何保存.txt http://blog.itpub.net/267265/viewspace-747304/
1.如果列值长度小于等于250字节,Oracle使用1字节存储其列长.内容为字段的长度.
2.如果列值长度超过250字节,则使用3字节存储其列长。前面1个字节使用0xfe(表示超过250),后面2个字节表示列值长度.

[20140512]关于降序索引.txt          http://blog.itpub.net/267265/viewspace-1159181/

时间: 2024-07-30 10:59:17

[20160619]NULL在数据库的存储.txt的相关文章

sqlite3-在 SQlite 数据库中存储 Null

问题描述 在 SQlite 数据库中存储 Null 我想实现下面的代码: String updateQuery ="INSERT INTO MAAccounts(userId, accountId, accountType, accountName, parentAccountId ) VALUES(?, ?, ?, ?, ?)"; Cursor c = mDb.rawQuery(updateQuery, new String[]{ stringToDB(account.userId)

【ANDROID游戏开发十三】(保存游戏数据 [下文])详解SQLITE存储方式,并把SQLITE的数据库文件存储在SD卡中!!!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/329.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

操作-分高悬赏答案!!sql server 2008 r2中怎样存储txt文件?

问题描述 分高悬赏答案!!sql server 2008 r2中怎样存储txt文件? 客户要求将大量TXT文件原封不动存入sql数据库,使用pb开发程序,通过pb可以实现文件的下载和上传,目前的问题就是,怎么才能将txt文件存入数据库?有几种方法?那种方法最简单易实现?具体操作怎么来?分高悬赏 解决方案 简单得很,先用编辑软件把字段之间用ascii码的t分隔,也就是tab那个键按出来的空白. 然后复制到excel,数据就从文本变成了表格形式.然后excel里面有拼接函数 那就拼接成一个inser

数据库中存储大量图片设计

1.图像的存储策略 在数据库的 开发过程中,经常需要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样-如有可能是语音文件.视频文件.图片文件.文本文件等,怎样 实现这些格式不同的备注文件的存取及预览,一直是开发人员比较关心的一个问题,本文系统的介绍了三种存取备注二进制信息的方法. 对备注二进制信息的存储可以采用以下三种方式: 方法一:文件保存在固定的路径下,数据库中存取文件路径和名称 方法二:数据库中用blob类型或者varbinary类型字段存储备注文件 方法三:在本地用Po

android-安卓:我想数据库里面存储数据,但是确定之后显示我活动崩溃了,真不知道哪里出错了

问题描述 安卓:我想数据库里面存储数据,但是确定之后显示我活动崩溃了,真不知道哪里出错了 首先是我的数据库类: 然后是我的存储代码: 最后是LOG: 请各位大神帮我看看抽时间,小弟我刚接触数据库,听说挺重要的,一定要弄会啊 解决方案 楼主要养成好习惯,还有空指针是最容易犯的错误,要学会如何排查,加油!本地数据库不难 解决方案二: http://www.cnblogs.com/Excellent/archive/2011/11/19/2254888.html 解决方案三: 对象没有实例化,Book

java-SQlite 数据库不能存储double 值为字符串

问题描述 SQlite 数据库不能存储double 值为字符串 我使用下面的代码 public boolean addArea(AreaClass area , ArrayList<AreaMarkClass> areaArray) { area.id = getNextAreaId(); Log.d("longitude", area.longitude); Log.d("latitude", area.latitude); ContentValues

c++ 写一个查询系统 ,不用数据库,从txt中读取数据,求大神指点啊 ...

问题描述 c++ 写一个查询系统 ,不用数据库,从txt中读取数据,求大神指点啊 ... 解决方案 你首先的规范text 文档的数据格式 ,然后通过文件流从文件中读取数据 解决方案二: 直接用ifstream读入,然后getline一行行读取,然后可以用sscanf格式化提取(因为你是用,分隔的) 可以把数据都存储下来(存在结构体数组或者vector都行) 之后再实现查找的功能

sql server-SQLServer如何定位数据库中存储的是那些信息

问题描述 SQLServer如何定位数据库中存储的是那些信息 我有一个网站后台数据库的备份,并且已经在自己机器上还原了,现在我想知道 这个数据库里面的每张表都对应的是网站上的那些信息,有什么好点的办法么?求大神指导 解决方案 这个需要分析,数据库存放数据跟网站信息对应是逻辑关系,只有网站开发者清楚,你需要先分析网站的数据是如何读取,组织的.然后再结合数据库来看各个字段是如何对应关系 解决方案二: NULL在SQLServer数据库日志文件中的存储 解决方案三: 这个只能通过字段找到那些内容是属于

网站上传的图片是怎么在数据库中存储的

问题描述 网站上传的图片是怎么在数据库中存储的,要是存在数据库中是不是增加数据库的负担,读写效率方面也不高?要是数据库只存放路径,图片存在web服务器文件夹里安全吗?QQ空间照片是怎么存储的?像百度文库doc.txt.pdf文件又是怎么存储的呢 解决方案 1.存到数据库里面,就是对图片数据进行序列化,可以保存到数据库里面2.存库和存硬盘的效率应该是差不多的,如果图片不多,存在库里面和存在硬盘上都一样,如果内容多了存在数据库里面会不方便,对于备份.恢复等操作不太方便3.图片存在web文件夹里面安全