Oracleでは ドキュメント
NUMBER(精度、スケール)
精度が指定されていない場合、列には指定された値が格納されます。スケールが指定されていない場合、スケールはゼロです。
しかし、NUMBER
(精度とスケールなし)も浮動小数点数(34.30)を受け入れますが、ドキュメントによると、スケールが指定されていない場合、デフォルトではゼロスケールである必要があるため、整数のみを許可する必要があります。間違っていますか?.
そして 別の質問 でそれは言及されています
デフォルトの精度は38、デフォルトのスケールはゼロです
したがって、NUMBER
とNUMBER(*,0)
は等しくなければなりませんが、等しくありません。
私はどこが間違っていますか?
スケールのデフォルトはゼロではなく、値がありません。したがって、-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>
ドキュメントの文章だと思います
精度が指定されていない場合、列には指定された値が格納されます。スケールが指定されていない場合、スケールはゼロです。
少し紛らわしいです。スケールはゼロです精度が指定されていてスケールが指定されていない場合。したがって、たとえば、NUMBER(19)
はNUMBER(19,0)
と同等です。 NUMBER
は、それ自体で38桁のprecisionになりますが、定義されていないscaleです。したがって、NUMBER
として定義された列は、精度が38桁以下(基本的に、任意の場所に小数点が付いた38桁の数字)である限り、any scaleの値を受け入れることができます。 。
精度なしでスケールを指定することもできます:NUMBER(*, <scale>)
、しかしそれは38桁の精度で列を作成するだけなので、それが特に役立つかどうかはわかりません。
このページ の表スケールファクターが数値データストレージにどのように影響するかが役立つ場合があります。
Oracleドキュメント のこの部分は、それを完全に明確にします。
次の形式を使用して整数を指定します。
NUMBER(p)
これは、精度pおよびスケール0の固定小数点数を表し、NUMBER(p、0)と同等です。
そして
次の形式を使用して浮動小数点数を指定します。
数
精度とスケール指定子がないため、Oracle番号の最大範囲と精度が指定されます。
star精度の意味は文書化されています ここ そして38の精度を意味します