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 15 Dezimalstellen) und dann wieder zurück in NUMBER konvertieren.

Snowflake unterstützt auch den Datentyp FLOAT, der einen größeren Wertebereich erlaubt, wenn auch mit geringerer Genauigkeit.

DECIMAL , DEC , 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 diese Information, um die Speichergröße für alle Werte in der Partition für diese Spalte zu ermitteln. Beispiel:

  • Enthält eine Spalte nur Werte zwischen -128 und +127, verbraucht jeder Wert 1 Byte (unkomprimiert).

  • Wenn der größte Wert in der Spalte 10000000 ist, dann verbraucht jeder Wert 4 Bytes (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.

Um Platz zu sparen, komprimiert Snowflake die Werte, bevor diese in den Speicher geschrieben werden. Der Grad der Komprimierung hängt von den Datenwerten und anderen Faktoren ab.

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

Datentypen für Fließkommazahlen

Snowflake unterstützt die folgenden Datentypen für binäre Festkommazahlen.

FLOAT , FLOAT4 , FLOAT8

Die Namen FLOAT, FLOAT4 und FLOAT8 dienen der Kompatibilität mit anderen Systemen. Snowflake behandelt alle drei als 64-Bit-Gleitkommazahlen.

Genauigkeit

Snowflake verwendet Fließkommazahlen mit doppelter Genauigkeit (64 Bit) IEEE 754.

Die Genauigkeit beträgt ungefähr 15 Stellen. Für ganze Zahlen liegt der Wertebereich beispielsweise zwischen -9007199254740991 und 9007199254740991 (-253 + 1 bis +253 - 1). Der Wertebereich von Gleitkommawerten liegt ungefähr zwischen 10-308 und 10+308. (Extremere Werte zwischen etwa 10-324 und 10-308 können mit geringerer Genauigkeit dargestellt werden). Weitere Informationen dazu finden Sie im Wikipedia-Artikel über Zahlen mit doppelter Genauigkeit.

Snowflake unterstützt auch den Datentyp NUMBER, der eine größere Präzision ermöglicht, wenn auch mit einem kleineren Bereich von Exponenten.

Besondere Werte

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.

Rundungsfehler

Bei Gleitkommaoperationen können in den niederwertigsten Stellen kleine Rundungsfehler auftreten. Rundungsfehler können bei jeder Art von Gleitkomma-Verarbeitung auftreten, einschließlich trigonometrischer Funktionen, statistischer Funktionen und Geodatenfunktionen.

Die Fehler können bei jeder Ausführung der Abfrage variieren.

Die Fehler können größer sein, wenn die Operanden eine unterschiedliche Genauigkeit oder Skalierung haben.

Fehler können sich summieren, insbesondere wenn Aggregatfunktionen (z. B. SUM() oder AVG()) eine große Anzahl von Zeilen verarbeiten. Eine Umwandlung in einen Festkommadatentyp vor dem Aggregieren kann diese Fehler reduzieren oder beseitigen.

Rundungsfehler können nicht nur bei der Verwendung von SQL auftreten, sondern auch bei der Arbeit mit anderem Code (z. B. Java, JavaScript oder Python), der innerhalb von Snowflake ausgeführt wird (z. B. in UDFs und gespeicherten Prozeduren).

Beim Vergleich zweier Gleitkommazahlen empfiehlt Snowflake, eher auf ungefähre Gleichheit als auf exakte Gleichheit zu prüfen.

DOUBLE , DOUBLE PRECISION , REAL

Synonym für FLOAT.

Beispiele für Fließkomma-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    |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

Bemerkung

In der Spalte „Typ“ des Befehls DESCRIBE TABLE wird der Datentyp „FLOAT“ nicht nur für FLOAT, sondern auch für Synonyme von FLOAT (z. B. DOUBLE, DOUBLE PRECISION und REAL) angezeigt.

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
Copy