暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 编号内部存储和显示

askTom 2017-02-27
301

问题描述

嗨,伙计们,

我试图执行下面的脚本,但在获取记录时得到了一些明确的结果。
我正在Windows 7操作系统中尝试此查询。

从V $ 版本中选择 *;
-
Oracle数据库11g企业版11.2.0.4.0-64位生产
PL/SQL版本11.2.0.4.0-生产
核心11.2.0.4.0生产
适用于Linux的TNS: 版本11.2.0.4.0-生产
NLSRTL版本11.2.0.4.0-生产

创建表TBL (RNO号,NO号);

截断表tbl;

INSERT INTO TBL VALUES
(95780971304118053647396689196894323976100000000000000,1);

INSERT INTO TBL VALUES
(99999999999999999999999999999999999999999,2);



从TBL中选择 *;

>
RNO否
-
95780971304118053647396689196894323976100000000000000 1
100000000000000000000000000000000000000000 2

你能详细说明一下为什么会这样吗?
在第一种情况下,它存储并显示相同的输入,而在第二种情况下,它将其视为100000000000000000000000000000000000000000。
这些数字是否有不同的内部存储机制。

请承认。

谢谢,
阿玛尔·鲍里斯哈。

专家解答

Oracle数据库最多使用22个字节来存储数字。

第一个字节用于列长度。
第二个是符号和指数。

这留下了20个字节来存储数字。Oracle可以每字节存储两个十进制数字。所以你可以有高达40位数的精度。

你没有指定精度。所以你最多可以存储40个。

当您尝试插入比这更精确的数字时,数据库会对其进行循环。尽管您的第一个数字有53位数字,但其中只有前40位是重要的。所以你可以把这个存储为:
9.57809713041180536473966891968943239761e52

因此没有必要四舍五入。但是第二位具有42位数字的重要性。因此,Oracle将其四舍五入:

drop table tbl purge;
CREATE TABLE TBL (RNO NUMBER,NO NUMBER);

INSERT INTO TBL VALUES (99999999999999999999999999999999999999, 1);
INSERT INTO TBL VALUES (999999999999999999999999999999999999999, 2);
INSERT INTO TBL VALUES (9999999999999999999999999999999999999999, 3);
INSERT INTO TBL VALUES (99999999999999999999999999999999999999999, 4);

INSERT INTO TBL VALUES (-99999999999999999999999999999999999999, 5);
INSERT INTO TBL VALUES (-999999999999999999999999999999999999999, 6);
INSERT INTO TBL VALUES (-9999999999999999999999999999999999999999, 7);
INSERT INTO TBL VALUES (-99999999999999999999999999999999999999999, 8);
commit;

select no, rno, dump(rno) from tbl;

NO  RNO                                                       DUMP(RNO)                                                                                          
1   99,999,999,999,999,999,999,999,999,999,999,999,999        Typ=2 Len=20: 211,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100      
2   999,999,999,999,999,999,999,999,999,999,999,999,999       Typ=2 Len=21: 212,10,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100   
3   9,999,999,999,999,999,999,999,999,999,999,999,999,999     Typ=2 Len=21: 212,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100  
4   100,000,000,000,000,000,000,000,000,000,000,000,000,000   Typ=2 Len=2: 213,11                                                                                
5   -99,999,999,999,999,999,999,999,999,999,999,999,999       Typ=2 Len=21: 44,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,102                                         
6   -999,999,999,999,999,999,999,999,999,999,999,999,999      Typ=2 Len=21: 43,92,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2                                          
7   -9,999,999,999,999,999,999,999,999,999,999,999,999,999    Typ=2 Len=21: 43,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2                                           
8   -100,000,000,000,000,000,000,000,000,000,000,000,000,000  Typ=2 Len=3: 42,91,102


http://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF00222
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论