Numerische Datentypen

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

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)). Die Genauigkeit begrenzt den Bereich der Werte, die in Spalten eines bestimmten Typs eingefügt (oder umgewandelt) werden können. Zum Beispiel passt der Wert 999 in NUMBER(38,0), jedoch nicht in NUMBER(2,0).

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

Bemerkung

Wenn Daten mit geringerer Genauigkeit in einen anderen Datentyp konvertiert werden und dann wieder in einen Datentyp mit höherer Genauigkeit zurückkonvertiert werden, können die Daten an Genauigkeit verlieren. Beispielsweise geht die Genauigkeit verloren, wenn Sie einen NUMBER(38,37)-Wert in erst in einen DOUBLE-Wert (mit einer Genauigkeit von etwa 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 das Genauigkeit und Skalierung nicht angegeben werden können (d. h. der Standardwert ist immer 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, BYTEINT usw.) sollen die Portierung von anderen Systemen vereinfachen und den erwarteten Wertebereich für eine Spalte des angegebenen Typs vorschlagen.

Auswirkung von Präzision und Skalierung auf die Speichergröße

Die Genauigkeit (Gesamtzahl der Ziffern) hat keinen Einfluss auf die Speicherung. 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 (die Anzahl der Ziffern nach dem Dezimalpunkt) wirkt sich jedoch auf die Speicherung aus. Beispielsweise verbraucht derselbe Wert, der in einer Spalte vom Typ NUMBER(10,5) gespeichert wird, mehr Platz als bei NUMBER(5,0). Außerdem kann die Verarbeitung von Werten mit einer größeren Skalierung etwas langsamer sein und mehr Speicher verbrauchen.

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

Die folgende Anweisung erstellt eine Tabelle mit Spalten mit verschiedenen Festkommadatentypen:

CREATE OR REPLACE TABLE test_fixed(
  num0 NUMBER,
  num10 NUMBER(10,1),
  dec20 DECIMAL(20,2),
  numeric30 NUMERIC(30,3),
  int1 INT,
  int2 INTEGER);

DESC TABLE test_fixed;
Copy
+-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name      | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| NUM0      | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| NUM10     | NUMBER(10,1) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| DEC20     | NUMBER(20,2) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| NUMERIC30 | NUMBER(30,3) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| INT1      | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| INT2      | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

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. (Snowflake kann extremere Werte zwischen etwa 10-324 und 10-308 mit geringerer Genauigkeit darstellen) 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' (keine Zahl)

  • 'inf' (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 Gleitkommaverarbeitung auftreten, einschließlich trigonometrischer Funktionen, statistischer Funktionen und Geodatenfunktionen.

Im Folgenden finden Sie Überlegungen zu Rundungsfehlern:

  • 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

Die folgende Anweisung erstellt eine Tabelle mit Spalten mit verschiedenen Gleitkommadatentypen:

CREATE OR REPLACE TABLE test_float(
  double1 DOUBLE,
  float1 FLOAT,
  dp1 DOUBLE PRECISION,
  real1 REAL);

DESC TABLE test_float;
Copy
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name    | type  | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| DOUBLE1 | FLOAT | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| FLOAT1  | FLOAT | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| DP1     | FLOAT | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| REAL1   | FLOAT | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

Bemerkung

In der Spalte type des Befehls DESC TABLE wird der Datentyp FLOAT nicht nur für FLOAT, sondern auch für Synonyme von FLOAT (zum Beispiel DOUBLE, DOUBLE PRECISION und REAL) angezeigt.

Numerische Konstanten

Der Begriff Konstanten (auch bekannt als Literale) bezieht 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