Numerische Datentypen

Unter diesem Thema werden die von Snowflake unterstützten numerischen Datentypen sowie die unterstützten Formate für numerische Konstanten/Literale beschrieben.

Unter diesem Thema:

Datentypen für Festkommazahlen

Snowflake unterstützt bei Festkommazahlen die folgenden Datentypen.

NUMBER

Zahlen mit bis zu 38 Ziffern mit einer optionalen Genauigkeit und Skalierung:

Genauigkeit

Gesamtzahl der zulässigen Stellen.

Skalierung

Anzahl der Stellen, die nach dem Komma zulässig sind.

Standardmäßig ist die Genauigkeit 38 und die Skalierung 0 (d. h. NUMBER(38, 0)). Beachten Sie, dass die Genauigkeit den Bereich der Werte begrenzt, die in Spalten eines bestimmten Typs eingefügt (oder umgewandelt) werden können. Beispielsweise passt der Wert 999 in NUMBER(38,0), aber nicht in NUMBER(2,0).

Die maximale Skalierung (Anzahl der Stellen rechts vom Dezimalpunkt) beträgt 37. Zahlen mit weniger als 38 signifikanten Stellen, deren niedrigste Stelle jedoch nach der 37. Dezimalstelle liegt, z. B. 0,0000000000000000000000000000000000000012 (1.2e-39), können nicht dargestellt werden, ohne dass einige Dezimalstellen der Genauigkeit verlorengehen.

Bemerkung

Wenn Daten mit geringerer Genauigkeit in einen anderen Datentyp konvertiert werden und dann wieder in eine Form mit höherer Genauigkeit zurückkonvertiert werden, können die Daten an Genauigkeit verlieren. Beispielsweise verlieren Sie die Genauigkeit, wenn Sie einen NUMBER(38,37)-Wert erst in DOUBLE (mit einer Genauigkeit von ungefähr 17 Dezimalstellen) und dann wieder zurück in NUMBER konvertieren.

DECIMAL , NUMERIC

Gleichbedeutend mit NUMBER.

INT , INTEGER , BIGINT , SMALLINT , TINYINT , BYTEINT

Gleichbedeutend mit NUMBER, außer dass Genauigkeit und Skalierung nicht angegeben werden können (d. h. der Standardwert ist stets NUMBER(38, 0)). Daher besteht der Wertebereich für alle INTEGER-Datentypen aus ganzzahligen Werten von -99999999999999999999999999999999999999 bis +99999999999999999999999999999999999999 (einschließlich).

Die verschiedenen Namen (TINYINT usw.) sollen die Portierung von anderen Systemen vereinfachen und den erwarteten Wertebereich für eine Spalte des angegebenen Typs vorschlagen.

Auswirkung von Genauigkeit und Skalierung auf die Speichergröße

Die Genauigkeit (Gesamtzahl der Stellen) hat keinen Einfluss auf die Speicherung. Mit anderen Worten: Die Speicheranforderungen für dieselbe Anzahl in Spalten mit unterschiedlichen Genauigkeiten, wie z. B. NUMBER(2,0) und NUMBER(38,0), sind gleich. Für jede Mikropartition legt Snowflake die Mindest- und Höchstwerte für eine bestimmte Spalte fest und verwendet diesen Bereich zum Speichern aller Werte in der Partition für diese Spalte. Beispiel:

  • Wenn eine Spalte fünf Werte enthält (z. B. 0, 1, 2, 3, 4), verbraucht jeder der Werte 1 Byte (unkomprimiert; der tatsächliche Speicherbedarf wird durch Komprimierung verringert).

  • Wenn eine Spalte längere Werte enthält (z. B. 0, 1, 2, 3, 4, 10000000), verbraucht jeder der Werte 4 Byte (unkomprimiert).

Die Skalierung (Anzahl der Nachkommastellen) hingegen wirkt sich auf den Speicherbedarf aus. Beispielsweise verbraucht derselbe Wert, der in einer Spalte vom Typ NUMBER(10,5) gespeichert wird, mehr Platz als NUMBER(5,0). Außerdem kann es sein, dass sich die Verarbeitung von Werten mit einer größeren Skalierung leicht verlangsamt und mehr Arbeitsspeicher beansprucht.

Beispiele für Festkomma-Datentypen in einer Tabelle

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    |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

Datentypen für Gleitkommazahlen

Snowflake unterstützt bei Gleitkommazahlen die folgenden Datentypen.

FLOAT , FLOAT4 , FLOAT8

Snowflake verwendet IEEE 754-Gleitkommazahlen mit doppelter Genauigkeit (64 Bit).

Snowflake unterstützt die folgenden speziellen FLOAT-Werte:

  • 'NaN' (Not a Number, keine Zahl)

  • 'inf' (Infinity, Unendlichkeit)

  • '-inf' (negative Unendlichkeit)

Die Symbole 'NaN', 'inf' und '-inf' müssen in einfache Anführungszeichen gesetzt werden. Dabei wird die Groß-/Kleinschreibung nicht berücksichtigt.

Die Vergleichssemantik für 'NaN' unterscheidet sich vom IEEE 754-Standard in folgenden Punkten:

Bedingung

Snowflake

IEEE 754

Kommentar

'NaN' = 'NaN'

TRUE

FALSE

In Snowflake sind 'NaN'-Werte alle gleich.

'NaN' > X ., wobei X ein beliebiger FLOAT-Wert ist, einschließlich . unendlich (anders als NaN selbst).

TRUE

FALSE

In Snowflake ist 'NaN' größer . als jeder andere FLOAT-Wert, . einschließlich unendlich.

DOUBLE , DOUBLE PRECISION , REAL

Gleichbedeutend mit FLOAT.

Beispiele für Gleitkomma-Datentypen in einer Tabelle

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    |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

Bemerkung

Die Spalten DOUBLE, FLOAT, DOUBLE PRECISION und REAL werden als FLOAT angezeigt, jedoch als DOUBLE gespeichert. Dies ist ein bekanntes Problem in Snowflake.

Numerische Konstanten

Konstanten (auch als Literale bekannt) beziehen sich auf feste Datenwerte. Folgende Formate werden bei numerischen Konstanten unterstützt:

[+-][digits][.digits][e[+-]digits]

Wobei:

  • + oder - für einen positiven bzw. negativen Wert steht. Der Standard ist positiv.

  • digits besteht aus einer oder mehrere Ziffern von 0 bis 9.

  • e (oder E) steht für einen Exponenten in wissenschaftlicher Notation. Auf das Exponentenzeichen, so vorhanden, muss mindestens eine Ziffer folgen.

Die folgenden Zahlen sind Beispiele für unterstützte numerische Konstanten:

15
+1.34
0.2
15e-03
1.234E2
1.234E+2
-1