使用上の注意 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - データ タイプおよびリテラル

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/tpf1598412463935.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1143
Product Category
Software
Teradata Vantage

一般

NUMBERデータ型には、以下の利点があります。
  • 既存のテーブルのNUMBER列の精度または位取りを、データ行の修正なしで増加させる機能を提供するため、数字列の定義における柔軟性が高まります。ただし、いくつかの制限があります。
  • NUMBERは格納される値に応じて0バイト~18バイトの間で変化できる可変長データ型であるため、数値型データの格納における効率が高まります。
  • 結果が入力の精度または位取りによって制限されないため、DECIMALデータ型と比べて、計算における柔軟性が高まります。
  • 範囲がDECIMALデータ型より広くなります。
  • NUMBERの方が保証される精度が高く、また、NUMBERは一般的な小数を正確に表わすことができるため、FLOATデータ型より正確度が高くなります。
  • 他のデータベースとの互換性が高まります。いくつかのデータベース ベンダーでは、類似したNUMBERデータ型を提供しています。
多くの目的に対して、NUMBERデータ型は正確な結果を提供できます。ただし、これは浮動小数点タイプです。浮動小数点タイプをサポートしているデータベース ベンダーは、評価の順序によっては異なる計算結果を出す場合があります。つまり、Vantageにより生成される結果が他のベンダーの結果と異なることや、同じクエリーを別の方法で実行しても同じ結果になることもあります。

ストレージ

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データは計算について完全な精度と位取りを保持します。