Oracle中数字的默认精度和小数位数是多少?

lawou6xi  于 2023-05-22  发布在  Oracle
关注(0)|答案(7)|浏览(349)

在Oracle中创建类型为NUMBER的列时,可以选择不指定精度或小数位数。如果不指定这些默认值,它们会做什么?

xoshrz7s

xoshrz7s1#

编号(精度、刻度)
如果未指定精度,则该列按给定值存储。如果未指定比例,则比例为零。
更多信息:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832

o2g1uqev

o2g1uqev2#

NUMBER类型可以以不同的样式指定:

Resulting  Resulting  Precision
Specification   Precision  Scale      Check      Comment
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
NUMBER          NULL       NULL       NO         'maximum range and precision',
                                                 values are stored 'as given'
NUMBER(P, S)    P          S          YES        Error code: ORA-01438
NUMBER(P)       P          0          YES        Error code: ORA-01438
NUMBER(*, S)    38         S          NO

其中,精度是总位数,小数位数是小数点右边或左边的位数(负小数位数)。
Oracle将ORA-01438指定为
值大于此列允许的指定精度
如表中所示,仅当显式指定精度时,此完整性检查才处于活动状态。否则,Oracle会使用某些未指定的方法对插入或更新的值进行静默舍入。

a2mppw5e

a2mppw5e3#

我相信默认精度是38,默认比例是零。但是,此列示例的实际大小是动态的。它将根据需要占用尽可能多的空间来存储值,或最大21字节。

qc6wkl3g

qc6wkl3g4#

Oracle按以下方式存储数字:1 byte表示幂,1 byte表示第一个有效数位(即分隔符之前的一位),其余的表示其他数字。
这里的digits是指centesimal digits(i. e. base 100

SQL> INSERT INTO t_numtest VALUES (LPAD('9', 125, '9'))
  2  /

1 row inserted

SQL> INSERT INTO t_numtest VALUES (LPAD('7', 125, '7'))
  2  /

1 row inserted

SQL> INSERT INTO t_numtest VALUES (LPAD('9', 126, '9'))
  2  /

INSERT INTO t_numtest VALUES (LPAD('9', 126, '9'))

ORA-01426: numeric overflow

SQL> SELECT DUMP(num) FROM t_numtest;

DUMP(NUM)
--------------------------------------------------------------------------------
Typ=2 Len=2: 255,11
Typ=2 Len=21: 255,8,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79

正如我们所看到的,这里的最大数是7.(7) * 10^124,并且他有19个十进制数位用于精度,或者38个十进制数位。

ee7vknir

ee7vknir5#

实际上,你可以自己测试。
CREATE TABLE CUSTOMERS ( CUSTOMER_ID NUMBER NOT NULL, JOIN_DATE DATE NOT NULL, CUSTOMER_STATUS VARCHAR2(8) NOT NULL, CUSTOMER_NAME VARCHAR2(20) NOT NULL, CREDITRATING VARCHAR2(10) ) ;
``
select column_name, data_type, nullable, data_length, data_precision, data_scale from user_tab_columns where table_name ='CUSTOMERS';

thigvfpy

thigvfpy6#

我扩展了光谱的答案,这样人们就不必亲自尝试了。
这是在Oracle Database 11 g Express Edition Release 11.2.0.2.0 - Production上完成的。

CREATE TABLE CUSTOMERS
(
  CUSTOMER_ID NUMBER NOT NULL,
  FOO FLOAT NOT NULL,
  JOIN_DATE DATE NOT NULL,
  CUSTOMER_STATUS VARCHAR2(8) NOT NULL,
  CUSTOMER_NAME VARCHAR2(20) NOT NULL,
  CREDITRATING VARCHAR2(10)
);

select column_name, data_type, nullable, data_length, data_precision, data_scale
from user_tab_columns where table_name ='CUSTOMERS';

从而产生

COLUMN_NAME      DATA_TYPE  NULLABLE DATA_LENGTH DATA_PRECISION DATA_SCALE
CUSTOMER_ID      NUMBER     N        22        
FOO              FLOAT      N        22          126    
JOIN_DATE        DATE       N        7        
CUSTOMER_STATUS  VARCHAR2   N        8        
CUSTOMER_NAME    VARCHAR2   N        20        
CREDITRATING     VARCHAR2   Y        10
ogsagwnx

ogsagwnx7#

目前接受的答案不正确:
如果未指定比例,则比例为零。
仅当指定了精度时才为真。
否则,对于类型为NUMBER的列,将使用最大小数位数(由于某种原因,似乎没有在任何地方指定此最大小数位数)。
Oracle的下表演示了以下行为:
| 输入数据|指定为|存储为|
| --------------|--------------|--------------|
| 一百二十三点八九|数量|一百二十三点八九|
| 一百二十三点八九|数量(3)|一百二十四|
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/Data-Types.html#GUID-75209AF6-476D-4C44-A5DC-5FA70D701B78__G196646

相关问题