web-dev-qa-db-ja.com

Oracleの数値のデフォルトの精度とスケールは何ですか?

OracleでNUMBER型の列を作成する場合、精度またはスケールを指定しないオプションがあります。指定しない場合、これらのデフォルトは何をしますか?

60
Matt

NUMBER(精度、スケール)

精度が指定されていない場合、列には指定された値が格納されます。スケールが指定されていない場合、スケールはゼロです。

さらに多くの情報:

http://download.Oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832

39

NUMBERタイプは 異なるスタイル で指定できます:

結果として得られる精度
仕様精度スケールチェックコメント
 ――――――――――――――――――――――――――――― ―――――――――――――――――――――――――――――――――――――――――――――――――― -
 NUMBER NULL NULL NO  '最大範囲 および 精度' 、
値は保存されます 'as given'  = 
 NUMBER(P、S)PS YESエラーコード:ORA-01438 
 NUMBER(P)P 0 YESエラーコード:ORA-01438 
 NUMBER(*、S)38 S NO 

ここで、精度は総桁数であり、スケールは小数点の右側または左側の桁数(負のスケール)です。

Oracleは、ORA-01438を次のように指定します。

この列に許可されている指定の精度より大きい値

表に記載されているように、この整合性チェックは、精度が明示的に指定されている場合にのみアクティブになります。それ以外の場合、Oracleは、指定されていない方法を使用して、挿入または更新された値をサイレントに丸めます。

22
maxschlepzig

デフォルトの精度は38、デフォルトのスケールはゼロだと思います。ただし、この列のインスタンスの実際のサイズは動的です。値を保存するために必要なだけのスペース、または最大21バイトが必要です。

14
baretta

Oracleは、次のように数値を格納します。_1 byte_は累乗、_1 byte_は最初の有効数字(区切り記号の前)、残りは他の数字です。

ここでdigitsOracleが_centesimal digits_を意味します(つまり_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_の100進数、または_38_の10進数を持っています。

9
Quassnoi

実際、いつでも自分でテストできます。

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';

4
spectra

スペクトルの答えを拡張して、人々が自分でスペクトルを試す必要がないようにします。

これは、Oracle Database 11g Express Editionリリース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    
1
bugybunny