一般
- 既存のテーブルのNUMBER列の精度または位取りを、データ行の修正なしで増加させる機能を提供するため、数字列の定義における柔軟性が高まります。ただし、いくつかの制限があります。
- NUMBERは格納される値に応じて0バイト~18バイトの間で変化できる可変長データ型であるため、数値型データの格納における効率が高まります。
- 結果が入力の精度または位取りによって制限されないため、DECIMALデータ型と比べて、計算における柔軟性が高まります。
- 範囲がDECIMALデータ型より広くなります。
- NUMBERの方が保証される精度が高く、また、NUMBERは一般的な小数を正確に表わすことができるため、FLOATデータ型より正確度が高くなります。
- 他のデータベースとの互換性が高まります。いくつかのデータベース ベンダーでは、類似したNUMBERデータ型を提供しています。
ストレージ
NUMBERは、指数と仮数で構成された可変長の値として格納されます。指数の基数は10です。このため、一般的な10進数を正確に表わすことができます。
1つの例外を除いて、記憶域のレイアウトは以下のようになります。
1バイト | 1~17バイト |
指数 | 仮数 |
例外は、値がゼロの場合です。これは、指数および仮数を持たない、長さゼロのNUMBERフィールドで示されます。
以下のテーブルは、記憶域の要件とNUMBERの値の範囲をまとめたものです。
データ型 | 必要なデータベース記憶域(バイト単位) | 数値の範囲 |
---|---|---|
NUMBER(n,m) | 0~18。実際に格納されている値に基づきます。 | 全体の桁数がnで、小数の桁数がmの数値。 |
NUMBER(*,m) | 0~18。実際に格納されている値に基づきます。 | 小数の桁数が最大mの数値。 |
NUMBER(*) | 0~18。実際に格納されている値に基づきます。 | ± [1E-130~9.99…9E125]、0を含む |
COMPRESS句を指定すると、値は行の圧縮部分に格納され、長さを示す余分な1バイトが必要になります。COMPRESS句がないと、値は行の可変部分に格納され、2バイト必要になります。可変部分がある行ごとに2バイト必要です。
NUMBERの外部表現
フィールド モードでは、NUMBERデータはFORMAT句に基づいて返されます。NUMBERのデフォルト形式、およびNUMBERデータでのFORMAT句の使用の詳細については、データ型のデフォルトの形式およびFORMAT句および数値の形式を参照してください。
フィールド モード以外の応答モードの場合、NUMBERデータは、ほとんどの値で以下の表現を持ちます。
1バイトの長さ | 2バイトの位取り | 1~17バイトの位取りしていない値の2の補足表現(クライアント固有のエンディアン)。 |
NUMBERがゼロまたはNULLの場合、長さの値はゼロになり、位取りまたは位取りしていない値が必要ないことを示します。
NUMBERとDECIMALの違い
NUMBER (n,m)の機能はDECIMAL (n,m)とよく似ています。また、DECIMALがサポートされている場合なら、いつでも使用できます。
NUMBERは以下の点でDECIMALと異なります。
DECIMAL | NUMBER |
---|---|
データ型は固定長であり、精度によって1、2、4、8または16バイトになります。 | データ型は可変長であり、内部的には0~18バイト、外部的には1~20バイトの間で変化します。 |
小数は、10のべき乗(指数は、小数部の桁数と等しい)によって位取りされます。この数は2の2進補数として格納されます。 | NUMBERは、指数と仮数で構成された可変長の値として格納されます。 |
既存のDECIMAL列の精度や位取りを、データ行の変更なしに変更することはできません。 | 既存のNUMBER列の精度や位取りをデータ行の変更なしに増加できます。ただし、いくつかの制限があります。詳細は、Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144のALTER TABLEを参照してください。 |
DECIMAL算術の中間結果の精度は、算術式で使用される引数に応じて、15、18、または38になります。 | NUMBERデータ型の計算は38桁の精度が保証されていますが、多くの場合、39桁または40桁の精度で実行されます。精度と位取りが制限されていない場合、NUMBERデータは計算について完全な精度と位取りを保持します。 そのため、算術演算1./3.をDECIMALで実行すると0.が返されますが、NUMBERで実行すると.3333333333...が返されることになります。 |
切り上げ/切り捨てモードはDBS制御のRoundHalfWayMagUpフィールドで制御されます。詳細は、切り上げ/切り捨てを参照してください。 | 切り上げ/切り捨てモードはDBS制御のRoundNumberAsDecフィールドで制御されます。詳細は、切り上げ/切り捨てを参照してください。 |
DECIMALに精度または位取りを指定していない場合、デフォルトはDECIMAL(5,0)になります。 | NUMBERに精度または位取りを指定していない場合、デフォルトはシステム制限の精度および位取りを持つNUMBERになります。 |
NUMBERとFLOATの違い
- NUMBER(*,m)
- NUMBER(*)、これはNUMBERと同等
FLOATがサポートされている場合は、いつでもNUMBERを使用できます。ただし、NUMBERは以下の点でFLOATと異なります。
FLOAT | NUMBER |
---|---|
データ型は固定長であり、8バイトの記憶域を使用します。 | データ型は可変長であり、内部的には0~18バイト、外部的には1~20バイトの間で変化します。 |
FLOATはIEEE-754規格を使用して格納されます。これは基数2を使用して浮動小数点数を表現します。また、一般には2進浮動小数点として知られています。 この格納スキーマは、すべての10進数値を正確に表現できません。 |
NUMBERは、指数と仮数で構成された可変長の値として格納されます。 この格納スキーマは10進数の基数を使用するため、正確に10進数の値を格納します。 |
FLOATは、15桁数の精度のみを提供できます。 | NUMBERデータ型の計算は38桁の精度が保証されていますが、多くの場合、39桁または40桁の精度で実行されます。精度と位取りが制限されていない場合、NUMBERデータは計算について完全な精度と位取りを保持します。 |