查看: 9396|回复: 15

[FAQ] Oracle中各数据类型的存储方式(ZT)

[复制链接]
论坛徽章:
30
ITPUB元老
日期:2005-10-06 13:25:212011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52马上有车
日期:2014-02-19 11:55:14
跳转到指定楼层
1#
发表于 2004-4-6 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Date(长度 7    类型 12)

col dump_date form a35
col real_date form a35
select dump(last_ddl_time) dump_date,
      to_char(last_ddl_time,'yyyy-mm-dd hh24:mi:ss') real_date
  from user_objects
where rownum=1;

DUMP_DATE                           REAL_DATE
----------------------------------- ---------------------
Typ=12 Len=7: 120,102,4,13,16,48,53 2002-04-13 15:47:52
世纪 120 - 100 = 20 世纪和年份加100后存储
年份 102 - 100 = 2
月份 4 月份和日期按原值存储
日期 13
小时 16 - 1 = 15 时间均加1后存储
分钟 48 - 1 = 47
秒 53 - 1 = 52

   


--------------------------------------------------------------------------------

Number(类型  2)

<[长度]>,符号位/指数 数字1,数字2,数字3,......,数字20

正数:指数=数字1 - 193 (最高位为1是代表正数)
负数:指数=62 - 第一字节

数字1是最高有效位

正数:加1存储
负数:被101减,如果总长度小于21个字节,最后加一个102(是为了排序的需要)

所存储的数值计算方法为:

把下面计算的结果加起来:

每个数字乘以100^(指数-N)    (N是有效位数的顺序位,第一个有效位的N=0)

例:

select dump(123456.789) from dual;

DUMP(123456.789)
-------------------------------
Typ=2 Len=6: 195,13,35,57,79,91   
指数 195 - 193 = 2
数字1 13 - 1 = 12 *1002-0 120000
数字2 35 - 1 = 34 *1002-1 3400
数字3 57 - 1 = 56 *1002-2 56
数字4 79 - 1 = 78 *1002-3 .78
数字5 91 - 1 = 90 *1002-4 .009
  123456.789

select dump(-123456.789) from dual;

DUMP(-123456.789)
----------------------------------
Typ=2 Len=7: 60,89,67,45,23,11,102
指数 62 - 60 = 2(最高位是0,代表为负数)
数字1 101 - 89 = 12 *1002-0 120000
数字2 101 - 67 = 34 *1002-1 3400
数字3 101 - 45 = 56 *1002-2 56
数字4 101 - 23 = 78 *1002-3 .78
数字5 101 - 11 = 90 *1002-4 .009
  123456.789(-)

  现在再考虑一下为什么在最后加102是为了排序的需要,-123456.789在数据库中实际存储为

  60,89,67,45,23,11

  而-123456.78901在数据库中实际存储为

  60,89,67,45,23,11,91

  可见,如果不在最后加上102,在排序时会出现-123456.789<-123456.78901的情况。
论坛徽章:
117
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主7段
日期:2012-05-15 15:24:11ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32紫蛋头
日期:2013-03-04 17:00:07优秀写手
日期:2013-12-18 09:29:09
2#
发表于 2004-4-6 15:13 | 只看该作者
就知道你要研究这个了,大家走同样的路

使用道具 举报

回复
论坛徽章:
30
ITPUB元老
日期:2005-10-06 13:25:212011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52马上有车
日期:2014-02-19 11:55:14
3#
 楼主| 发表于 2004-4-6 15:22 | 只看该作者
这是我前段时间看到的一片文章,今天才有空回过来再验证

我看了一下 dump的data block的内容:
tl: 9 fb: --H-FL-- lb: 0x0 cc: 2
col  0: [ 2]  c1 02
col  1: [ 2]  61 61
tab 0, row 1, @0x1f8e
tl: 9 fb: --H-FL-- lb: 0x0 cc: 2
col  0: [ 2]  c1 03
col  1: [ 2]  61 61

这里存的是16进制的格式

SQL> select dump(id),dump(name),id,name from test_index;                             
                                                                                    
DUMP(ID)                       DUMP(NAME)                 ID NAME                    
------------------------------ ----------------------------- --------------------   
Typ=2 Len=2: 193,2             Typ=1 Len=2: 97,97          1 aa                     
Typ=2 Len=2: 193,3             Typ=1 Len=2: 97,97          2 aa        

从这里看好像column的数据类型,即Typ的信息没有在block中体现了。              

最初由 eygle 发布
[B]就知道你要研究这个了,大家走同样的路 [/B]


以后还有很长的路要走,希望能坚持到底了

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
4#
发表于 2004-4-6 15:24 | 只看该作者
楼主是专贴哦?

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
5#
发表于 2004-4-6 15:26 | 只看该作者
zhichi

使用道具 举报

回复
论坛徽章:
30
ITPUB元老
日期:2005-10-06 13:25:212011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52马上有车
日期:2014-02-19 11:55:14
6#
 楼主| 发表于 2004-4-6 15:43 | 只看该作者
最初由 xzh2000 发布
[B]楼主是专贴哦? [/B]


是啊,前段时间正好再看这个内容,发现了这篇文章,贴上来共享给大家。

前人种树,后人乘凉嘛

使用道具 举报

回复
论坛徽章:
12
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-04-24 14:03:07授权会员
日期:2006-04-24 13:56:42ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:虎
日期:2008-01-02 17:35:53CTO参与奖
日期:2009-01-15 11:42:46目光如炬
日期:2017-04-09 22:00:00
7#
发表于 2004-7-6 11:21 | 只看该作者
1* SELECT DUMP(SYSDATE) DUM,TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') TDATE FROM DUAL
SQL> /

DUM                                      TDATE
---------------------------------------- -------------------
Typ=13 Len=8: 212,7,7,6,11,22,5,0        2004-07-06 11:22:05

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
8#
发表于 2004-8-20 11:17 | 只看该作者

有几个问题

这段话中 指数 62 - 60 = 2(最高位是0,代表为负数) [/COLOR]
是0[/COLOR],不知道是不是楼主的笔误,应该是6?

2、负数后面的102如何使用/起到作用?

3、xie3000举的例如何理解?

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:342010新春纪念徽章
日期:2010-03-01 11:20:51
9#
发表于 2004-8-20 12:01 | 只看该作者
xie3000 sysdateTyp=13 Len=8与楼主说的不致呀

最好说明数据版本, os !

使用道具 举报

回复
论坛徽章:
30
ITPUB元老
日期:2005-10-06 13:25:212011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52马上有车
日期:2014-02-19 11:55:14
10#
 楼主| 发表于 2004-8-20 12:07 | 只看该作者

Re: 有几个问题

最初由 ZALBB 发布
[B]这段话中 指数 62 - 60 = 2(最高位是0,代表为负数) [/COLOR]
是0[/COLOR],不知道是不是楼主的笔误,应该是6?

2、负数后面的102如何使用/起到作用?

3、xie3000举的例如何理解? [/B]


1.这个是转贴的,不是我写的
2.关于这个问题,和你先在PM里问的问题,从这个文章中都能找到答案
http://www.ixora.com.au/notes/number_representation.htm

3.
SQL> create table test1 as select sysdate as test_date from dual;

Table created

SQL> select dump(test_date) from test1;

DUMP(TEST_DATE)
--------------------------------------------------------------------------------
Typ=12 Len=7: 120,104,8,20,12,53,47
SQL> select dump(TO_date(SYSDATE)) from dual;

DUMP(TO_DATE(SYSDATE))
--------------------------------------------------------------------------------
Typ=13 Len=8: 212,7,8,20,0,0,0,0

我们看到这两个不同的结果中typ都是不一样的。
这篇文章讲的是Oracle中各数据类型的[B]存储方式[/B]
文章中这种情况(即typ=12)是date的存储情况,oracle在memory中的使用是有些不一样的,所以这里的typ=13,而不是12。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表