OracleでNUMBER型の列を作成する場合、精度またはスケールを指定しないオプションがあります。指定しない場合、これらのデフォルトは何をしますか?
NUMBER(精度、スケール)
精度が指定されていない場合、列には指定された値が格納されます。スケールが指定されていない場合、スケールはゼロです。
さらに多くの情報:
http://download.Oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832
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は、指定されていない方法を使用して、挿入または更新された値をサイレントに丸めます。
デフォルトの精度は38、デフォルトのスケールはゼロだと思います。ただし、この列のインスタンスの実際のサイズは動的です。値を保存するために必要なだけのスペース、または最大21バイトが必要です。
Oracle
は、次のように数値を格納します。_1 byte
_は累乗、_1 byte
_は最初の有効数字(区切り記号の前)、残りは他の数字です。
ここでdigits
はOracle
が_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進数を持っています。
実際、いつでも自分でテストできます。
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';
スペクトルの答えを拡張して、人々が自分でスペクトルを試す必要がないようにします。
これは、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