web-dev-qa-db-ja.com

Oracleでは「NUMBER」と「NUMBER(*、0)」は同じですか?

Oracleでは ドキュメント

NUMBER(精度、スケール)

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

しかし、NUMBER(精度とスケールなし)も浮動小数点数(34.30)を受け入れますが、ドキュメントによると、スケールが指定されていない場合、デフォルトではゼロスケールである必要があるため、整数のみを許可する必要があります。間違っていますか?.

そして 別の質問 でそれは言及されています

デフォルトの精度は38、デフォルトのスケールはゼロです

したがって、NUMBERNUMBER(*,0)は等しくなければなりませんが、等しくありません。

私はどこが間違っていますか?

6
Rajeev

スケールのデフォルトはゼロではなく、値がありません。したがって、-84 to 127の間の任意の値を受け入れることができます。ゼロに制限すると、値にスケール値が含まれていても、プレシジョンは受け入れられません。

create table aaaaa
(
sno number(*,0),
sno1 number
);

user_tab_columnsは、精度とスケールの値を提供します

SQL> select column_name,data_precision,data_scale from user_tab_columns where ta
ble_name = 'AAAAA';

COLUMN_NAME                    DATA_PRECISION DATA_SCALE
------------------------------ -------------- ----------
SNO                                                    0
SNO1

SQL>

以下の仕組みを見つけてください

SQL> select * from aaaaa;

no rows selected

SQL> insert into aaaaa values (123.123123,123123.21344);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from aaaaa;

       SNO       SNO1
---------- ----------
       123 123123.213

SQL>
7
Exhausted

ドキュメントの文章だと思います

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

少し紛らわしいです。スケールはゼロです精度が指定されていてスケールが指定されていない場合。したがって、たとえば、NUMBER(19)NUMBER(19,0)と同等です。 NUMBERは、それ自体で38桁のprecisionになりますが、定義されていないscaleです。したがって、NUMBERとして定義された列は、精度が38桁以下(基本的に、任意の場所に小数点が付いた38桁の数字)である限り、any scaleの値を受け入れることができます。 。

精度なしでスケールを指定することもできます:NUMBER(*, <scale>)、しかしそれは38桁の精度で列を作成するだけなので、それが特に役立つかどうかはわかりません。

このページ の表スケールファクターが数値データストレージにどのように影響するかが役立つ場合があります。

6
David Faber

Oracleドキュメント のこの部分は、それを完全に明確にします。

次の形式を使用して整数を指定します。

NUMBER(p)

これは、精度pおよびスケール0の固定小数点数を表し、NUMBER(p、0)と同等です。

そして

次の形式を使用して浮動小数点数を指定します。

精度とスケール指定子がないため、Oracle番号の最大範囲と精度が指定されます。

star精度の意味は文書化されています ここ そして38の精度を意味します

0
Marmite Bomber