数値データ型¶
このトピックでは、Snowflakeでサポートされている数値データ型と、数値定数/リテラルでサポートされている形式について説明します。
このトピックの内容:
固定小数点数のデータ型¶
Snowflakeは、固定小数点数について次のデータ型をサポートしています。
NUMBER¶
オプションの精度とスケールを使用した、最大38桁の数字です。
- 精度:
許可される合計桁数です。
- スケール:
小数点の右側に許可される桁数です。
デフォルトでは、精度は 38
、スケールは 0
(NUMBER(38, 0)
)です。精度は、特定の型の列に挿入できる(またはキャストできる)値の範囲を制限します。例えば、値 999
は NUMBER(38,0)
に適合しますが、 NUMBER(2,0)
には適合しません。
最大スケール(小数点の右側の桁数)は37です。有効桁数が38未満ですが、最下位桁が小数点以下37桁を超える数値(例:0.0000000000000000000000000000000000000012(1.2e-39)は、一部の精度の桁を失うことなく表現できません。
注釈
データがより低い精度で別のデータ型に変換された後、より高い精度の形式に戻されると、データの精度が失われる可能性があります。たとえば、 NUMBER(38,37)の値を DOUBLE (およそ小数点15桁の精度)に変換してから NUMBER に戻すと、精度が低下します。
Snowflakeは FLOAT データ型もサポートしているため、精度は低くなりますが、より広い範囲の値を使用できます。
DECIMAL , DEC , NUMERIC¶
NUMBERと同義語です。
INT , INTEGER , BIGINT , SMALLINT , TINYINT , BYTEINT¶
精度とスケールを指定できないことを除き、 NUMBER と同義語です(つまり、常にデフォルトの NUMBER(38, 0)
)。したがって、すべての INTEGER データ型について、値の範囲は-99999999999999999999999999999999999999から+99999999999999999999999999999999999999(両端を含む)までの整数値すべてです。
さまざまな名前( TINYINT など)は、他のシステムからの移植を簡略化し、指定されたタイプの列に期待される値の範囲を提案するためのものです。
ストレージサイズに対する精度とスケールの影響¶
精度(総桁数)はストレージに影響しません。つまり、 NUMBER(2,0)
や NUMBER(38,0)
など、精度の異なる列の同じ数値のストレージ要件は同じです。Snowflakeは、各マイクロパーティションについて、特定の列の最小値と最大値を決定し、その情報を使用して、パーティションにあるその列に対するすべての値のストレージサイズを決定します。例:
列に
-128
から+127
までの値のみが含まれている場合、各値は1バイト(非圧縮)を消費します。列の最大値が
10000000
の場合、各値は4バイト(非圧縮)を消費します。
ただし、スケール(小数点以下の桁数)はストレージに影響します。例えば、 NUMBER(10,5)
型の列に保存された同じ値は、 NUMBER(5,0)
よりも多くのスペースを消費します。また、より大きなスケールでの値の処理はわずかに遅くなり、より多くのメモリを消費します。
スペースを節約するために、Snowflakeは値をストレージに書き込む前に圧縮します。圧縮の量は、データ値やその他の要因によって異なります。
テーブル内の固定小数点データ型の例¶
CREATE OR REPLACE TABLE test_fixed(num NUMBER,
num10 NUMBER(10,1),
dec DECIMAL(20,2),
numeric NUMERIC(30,3),
int INT,
integer INTEGER
);
DESC TABLE test_fixed;
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment |
|---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| NUM | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| NUM10 | NUMBER(10,1) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| DEC | NUMBER(20,2) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| NUMERIC | NUMBER(30,3) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| INT | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| INTEGER | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
浮動小数点数のデータ型¶
Snowflakeは、浮動小数点数に対して次のデータ型をサポートしています。
FLOAT , FLOAT4 , FLOAT8¶
名前 FLOAT、 FLOAT4、および FLOAT8 は、他のシステムとの互換性のためです。Snowflakeは、3つすべてを64ビットの浮動小数点数として扱います。
精度¶
Snowflakeは、倍精度(64ビット) IEEE 754浮動小数点数を使用します。
精度は約15桁です。たとえば、整数の場合、範囲は-9007199254740991から+9007199254740991(-253 + 1から+253 - 1)です。浮動小数点値の範囲は、およそ10:sup:-308 から10:sup:+308 です。(およそ10-324 と 10-308 の間のより極端な値の場合は、精度が低くなる可能性があります。)詳細については、 倍精度数に関するウィキペディアの記事 をご参照ください。
Snowflakeは固定小数点データ型 NUMBER をサポートしているため、指数の範囲は狭くなりますが、精度が向上します。
特別な値¶
Snowflakeは、 FLOAT に対して次の特別な値をサポートしています。
'NaN'
(非数)。'inf'
(無限大)。'-inf'
(負の無限大)。
記号 'NaN'
、 'inf'
、および '-inf'
は一重引用符で囲む必要があり、大文字と小文字は区別されません。
'NaN'
の比較セマンティクスは、次の点で IEEE 754標準と異なります。
条件 |
Snowflake |
IEEE 754 |
コメント |
---|---|---|---|
|
|
|
Snowflakeでは、 |
|
|
|
Snowflakeは、 |
丸め誤差¶
浮動小数点演算では、最下位桁に小さな丸め誤差が生じる可能性があります。丸め誤差は、三角関数、統計関数、地理空間関数など、あらゆるタイプの浮動小数点処理で発生する可能性があります。
エラーは、クエリが実行されるたびに変わる可能性があります。
オペランドの精度やスケールが異なると、エラーが大きくなる可能性があります。
特に集計関数(例: SUM() または AVG())が多数の行を処理する場合は、エラーの蓄積される可能性があります。集約する前に固定小数点データ型にキャストすると、これらのエラーを削減または排除できます。
丸め誤差は、 SQL を操作する場合だけではなく、Snowflake内で実行される他のコード(例: Java、 JavaScript、またはPython)を操作する場合にも発生する可能性があります(例: UDFs および ストアドプロシージャ)。
2つの浮動小数点数を比較する場合、Snowflakeは、正確な等式ではなく、近似的な等式を比較することをお勧めします。
DOUBLE , DOUBLE PRECISION , REAL¶
FLOAT と同義語です。
テーブル内の浮動小数点データ型の例¶
CREATE OR REPLACE TABLE test_float(d DOUBLE,
f FLOAT,
dp DOUBLE PRECISION,
r REAL
);
DESC TABLE test_float;
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment |
|---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| D | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| F | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| DP | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| R | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
注釈
DESCRIBE TABLE
コマンドの「type」列には、 FLOAT だけでなく、 FLOAT の同義語(列: DOUBLE、 DOUBLE PRECISION、 REAL)のデータ型「FLOAT」も表示されます。
数値定数¶
定数 (別名 リテラル)は、固定データ値を指します。数値定数では、次の形式がサポートされています。
[+-][digits][.digits][e[+-]digits]
条件:
+
または-
は正または負の値を示します。デフォルトは正です。digits
は、0から9までの1桁以上です。e
(またはE
)は、科学表記法の指数を示します。指数マーカーが存在する場合は、少なくとも1桁が指数マーカーの後に続く必要があります。
次の数値は、すべてサポートされている数値定数の例です。
15
+1.34
0.2
15e-03
1.234E2
1.234E+2
-1