Numerische Datentypen¶
This topic describes the numeric data types supported in Snowflake, along with the supported formats for numeric constants and literals.
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.
By default, precision is 38, and scale is 0; that is, NUMBER(38, 0). Precision limits the range
of values that can be inserted into or cast to columns of a given type. For example, the value 999 fits into
NUMBER(38,0) but not into NUMBER(2,0).
Because precision is the total number of digits allowed, you can’t load a value into a NUMBER column if the number of digits to the left of the decimal point exceeds the precision of the column minus its scale. For example, NUMBER(20, 2) allows 18 digits on the left side of the decimal point and two digits on the right side of the decimal point, for a total of 20 digits.
The maximum scale, which is the number of digits to the right of the decimal point, is 37. Numbers that have fewer than 38 significant digits, but whose least significant digit is past the 37th decimal place — for example, 0.0000000000000000000000000000000000000012 (1.2e-39) — can’t be represented without losing some digits of precision.
Bemerkung
If data is converted to another data type with lower precision, and then converted back to the higher-precision data type, the data can lose precision. For example, precision is lost if you convert a NUMBER(38,37) value to a DOUBLE value — which has a precision of approximately 15 decimal digits — and then back to NUMBER.
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).
The various names — for example, TINYINT, BYTEINT, and so on —are to simplify porting from other systems and to suggest the expected range of values for a column of the specified type.
Auswirkung von Präzision und Skalierung auf die Speichergröße¶
Precision — the total number of digits — doesn’t affect storage. The storage requirements for the same number in columns with different precisions, such as NUMBER(2,0) and NUMBER(38,0), are the same. For each micro-partition, Snowflake determines the minimum and maximum values for a given column and uses that information to determine the storage size for all values for that column in the partition. For example:
If a column contains only values between
-128and+127, each of the values consumes 1 byte (uncompressed).If the largest value in the column is
10000000, each of the values consumes 4 bytes (uncompressed).
However, scale — the number of digits following the decimal point — affects storage. For example, the same value stored in a column of type NUMBER(10,5) consumes more space than NUMBER(5,0). Also, processing values with a larger scale might be slightly slower and consume more memory.
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;
+-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| 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.
Precision is approximately 15 digits. For example, for integers, the range is from -9007199254740991 to +9007199254740991 (-253 + 1 to +253 - 1). Floating-point values can range from approximately 10-308 to 10+308. Snowflake can represent more extreme values between approximately 10-324 and 10-308 with less precision. For more details, see the Wikipedia article on double-precision numbers.
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 |
|---|---|---|---|
|
|
|
In Snowflake sind |
|
|
|
In Snowflake ist |
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.
The following list shows considerations for rounding errors:
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.
Errors can accumulate, especially when aggregate functions —for example, SUM or AVG — process large numbers of rows. Casting to a fixed-point data type before aggregating can reduce or eliminate these errors.
Rounding errors can occur not only when working with SQL, but also when working with other code — for example, Java, JavaScript, or Python — that runs inside Snowflake — for example, in UDFs and stored procedures.
Beim Vergleich zweier Gleitkommazahlen empfiehlt Snowflake, eher auf ungefähre Gleichheit als auf exakte Gleichheit zu prüfen.
Es könnte möglich sein, diese Arten von Näherungsfehlern zu vermeiden, indem Sie den exakten DECFLOAT-Datentyp verwenden.
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;
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| 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
The DESC TABLE command’s type column displays the data type FLOAT not only for FLOAT, but also for synonyms
of FLOAT; for example, DOUBLE, DOUBLE PRECISION, and REAL.
DECFLOAT¶
Bei der Gleitkommadarstellung (DECFLOAT) werden die Zahlen genau und mit bis zu 38 signifikanten Stellen präzise gespeichert. Für sehr große oder kleine Werte wird auf Exponenten zur Basis 10 zurückgegriffen. Der Exponentenbereich reicht von -16383 bis 16384 und erlaubt Werte ungefähr zwischen -10^(16384) und 10^(16384). Der DECFLOAT-Datentyp unterstützt eine variable Skalierung, sodass die Zahl der Nachkommastellen abhängig vom gespeicherten Wert variiert. Im Gegensatz zum FLOAT-Datentyp, der Werte als Näherungen darstellt, stellt der DECFLOAT-Datentyp exakte Werte mit der angegebenen Genauigkeit dar.
Der DECFLOAT-Datentyp unterstützt nicht die folgenden Spezialwerte, die vom FLOAT-Datentyp unterstützt werden: 'NaN' (keine Zahl) 'inf' (Unendlichkeit) und '-inf' (negative Unendlichkeit)
Anwendungsfälle für den DECFLOAT-Datentyp¶
Verwenden Sie den DECFLOAT-Datentyp, wenn Sie exakte Dezimalergebnisse und eine große, variable Skalierung in derselben Spalte benötigen.
Der DECFLOAT-Datentyp ist für die folgenden allgemeinen Anwendungsfälle geeignet:
Aufnahme von Daten, wenn die Zahl der Nachkommastellen bei den erfassten numerischen Werte unbekannt ist oder sehr stark variiert.
Wenn exakte numerische Werte erforderlich sind, wie z. B. für die Kontoführung, Steuern oder Compliance.
Bei der Migration von Systemen, die auf die IEEE 754-Dezimaldarstellung oder 128-Bit-Dezimalzahlen angewiesen sind. Diese Migrationen können durch die Genauigkeits- oder Bereichsbeschränkungen anderer Snowflake-Datentypen blockiert werden.
Sie möchten
Number out of representable range-Fehler beim Addieren, Multiplizieren oder Dividieren von hochpräzisen numerischen Werten vermeiden.
Sie können zum Beispiel den DECFLOAT-Datentyp für die folgenden konkreten Anwendungsfälle einsetzen:
Bei der Aufnahme von Daten aus Oracle-DECIMAL- oder -DB2 DECFLOAT-Spalten mit unterschiedlich vielen Nachkommastellen
Bei Finanzmodellierungen, die Berechnungen mit nur schwer vorhersagbaren Ergebnisgrößen.
Bei wissenschaftlichen Messungen, die zwischen sehr kleinen und sehr großen Einheiten wechseln.
Sie können den NUMBER-Datentyp weiterhin für numerische Spalten mit fester Zahl von Nachkommastellen oder den FLOAT-Datentyp für Analysen mit hohem Durchsatz, bei denen ungenaue Ergebnisse akzeptabel sind, verwenden.
Nutzungshinweise für den DECFLOAT-Datentyp¶
Wenn eine Operation ein Ergebnis mit mehr als 38 Ziffern erzeugt, wird der DECFLOAT-Wert auf eine Genauigkeit von 38 Stellen gerundet, wobei die niederwertigsten Stellen gemäß dem aktuellen Rundungsmodus gerundet werden. Snowflake verwendet den Rundungsmodus „Half up“ für DECFLOAT-Werte
Wenn Sie einen DECFLOAT-Wert angeben oder einen Wert in einen DECFLOAT-Wert umwandeln, vermeiden Sie die Verwendung von numerischen Literalen in SQL. Wenn Sie numerische Literale in SQL verwenden, werden die Werte als NUMBER- oder FLOAT-Werte interpretiert, bevor sie in einen DECFLOAT-Wert umgewandelt werden, was zu Bereichsfehlern oder Genauigkeitsverlusten führen kann. Verwenden Sie stattdessen Zeichenfolgen-Literale wie
SELECT '<value>'::DECFLOAT(oder das DECFLOAT-Literal) wieSELECT DECFLOAT '<value>'.Wenn bei Operationen DECFLOAT-Werte und Werte mit anderem numerischem Typ vermischt werden, bevorzugt die Koersion DECFLOAT-Werte. Beispiel: Wenn Sie einen Wert des NUMBER-Typs und des DECFLOAT-Typs hinzufügen, ist das Ergebnis ein DECFLOAT-Wert.
Die Verwendung des DECFLOAT-Typs kann zu einem erhöhten Speicherverbrauch führen.
Treiber und Treiberversionen, die den DECFLOAT-Datentyp unterstützen¶
Die folgenden Snowflake-Treiber und -Treiberversionen unterstützen den DECFLOAT-Datentyp. Möglicherweise müssen Sie Ihre Treiber auf die Versionen aktualisieren, die DECFLOAT unterstützen:
Treiber |
Unterstützte Mindestversion |
Anmerkungen |
|---|---|---|
Snowflake-Konnektor für Python |
3.14.1 |
pandas-DataFrames unterstützen den DECFLOAT-Typ nicht. |
ODBC |
3.12.0 |
Keine. |
JDBC |
3.27.0 |
Keine. |
Go Snowflake Driver |
1.17.0 |
Keine. |
SQL API |
2.0.0 |
Keine. |
Nicht unterstützte Treiber behandeln DECFLOAT-Werte als TEXT-Werte Bei einigen Treibern muss ein Treiberparameter festgelegt werden, um den DECFLOAT-Typ einem sprachnativen Typ zuzuordnen. Weitere Informationen dazu finden Sie unter Treiber.
Einschränkungen für den DECFLOAT-Datentyp¶
Die folgenden Einschränkungen gelten für den DECFLOAT-Typ:
DECFLOAT-Werte können nicht in VARIANT-, OBJECT- oder ARRAY-Werten gespeichert werden. Um einen DECFLOAT-Typ in einen VARIANT-Wert umzuwandeln, können Sie ihn zunächst in einen VARCHAR-Wert und dann in einen VARIANT-Wert umwandeln.
DECFLOAT-Werte werden in den folgenden Tabellentypen nicht unterstützt:
Tabellen in externen Formaten, z. B. Iceberg
Hybridtabellen
Der DECFLOAT-Datentyp wird in gespeicherten Snowflake Scripting-Prozeduren nicht unterstützt. Es wird jedoch in benutzerdefinierten Snowflake Scripting-Funktionen (UDFs) unterstützt.
Der DECFLOAT-Datentyp wird in gespeicherten Prozeduren oder UDFs, die in einer anderen Sprache als SQL geschrieben sind (wie Python oder Java), nicht unterstützt.
Der DECFLOAT-Datentyp wird in Snowpark nicht unterstützt.
Snowsight bietet nur eine begrenzte Unterstützung für den DECFLOAT-Datentyp.
Die folgenden Features unterstützen den DECFLOAT-Datentyp nicht:
Die Typen NUMBER und FLOAT bieten eventuell eine bessere Leistung als der DECFLOAT-Typ.
Examples for the DECFLOAT data type¶
Die folgenden Beispiele verwenden den DECFLOAT-Datentyp:
Unterschiede zwischen DECFLOAT und FLOAT¶
Das folgende Beispiel zeigt die Unterschiede zwischen den Datentypen DECFLOAT und FLOAT:
Erstellen Sie eine Tabelle mit einer DECFLOAT-Spalte und einer FLOAT-Spalte, und fügen Sie dann die gleichen Werte für beide Typen in die Tabelle ein:
CREATE OR REPLACE TABLE decfloat_sample ( id INT, decfloat_val DECFLOAT, float_val FLOAT); INSERT INTO decfloat_sample VALUES ( 1, DECFLOAT '123e7000', FLOAT '123e7000' ), ( 2, 12345678901234567890123456789::DECFLOAT, 12345678901234567890123456789::FLOAT ), ( 3, '-4.2e-5432'::DECFLOAT, '-4.2e-5432'::FLOAT ), ( 4, '1.00000000000000000000000000000000000014'::DECFLOAT, '1.00000000000000000000000000000000000014'::FLOAT ), ( 5, '1.00000000000000000000000000000000000015'::DECFLOAT, '1.00000000000000000000000000000000000015'::FLOAT );
Die Anweisung fügt DECFLOAT-Werte wie folgt ein:
Der erste Wert wird mit dem DECFLOAT-Literal eingefügt.
Der zweite Wert wird durch Umwandeln eines INTEGER-Werts in einen DECFLOAT-Wert eingefügt.
Der dritte, vierte und fünfte Wert werden durch Umwandeln eines VARCHAR-Wert in einen DECFLOAT-Wert eingefügt.
Um die Typen anzuzeigen, beschreiben Sie die Tabelle mit dem DESC TABLE-Befehl.
Die Genauigkeit wurde in der Tabellendefinition für keine der beiden Spalten angegeben, aber die Ausgabe zeigt, dass der DECFLOAT-Datentyp eine Genauigkeit mit bis zu 38 signifikanten Stellen unterstützt:
DESC TABLE decfloat_sample;
+--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+ | name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain | |--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------| | ID | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL | | DECFLOAT_VAL | DECFLOAT(38) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL | | FLOAT_VAL | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL | +--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
Um die Unterschiede in den Werten anzuzeigen, fragen Sie die Tabelle mit der SELECT-Anweisung ab:
SELECT * FROM decfloat_sample;
+----+-----------------------------------------+------------------------+ | ID | DECFLOAT_VAL | FLOAT_VAL | |----+-----------------------------------------+------------------------| | 1 | 1.23e7002 | inf | | 2 | 12345678901234567890123456789 | 1.23456789012346e+28 | | 3 | -4.2e-5432 | -0 | | 4 | 1.0000000000000000000000000000000000001 | 1 | | 5 | 1.0000000000000000000000000000000000002 | 1 | +----+-----------------------------------------+------------------------+
Die Ausgabe weist die folgenden Unterschiede auf:
Die erste Zeile zeigt, dass der DECFLOAT-Typ einen größeren Wertebereich als der FLOAT-Typ unterstützt. Der DECFLOAT-Wert ist sehr groß (
1.23e7002). Der FLOAT-Wert istinf. Das bedeutet, dass er größer als jeder mit dem FLOAT-Typ darstellbare Wert ist.Die zweite Zeile zeigt, dass der DECFLOAT-Typ den angegebenen Wert genau beibehält. Der FLOAT-Wert ist ein Näherungswert in wissenschaftlicher Notation.
Die dritte Zeile zeigt, dass der DECFLOAT-Typ sehr kleine Werte (
-4.2e-5432) unterstützt. Der FLOAT-Wert wird zum Näherungswert-0.Die vierte und fünfte Zeile zeigen, dass der DECFLOAT-Typ Genauigkeiten von bis zu 38 Stellen unterstützt; für Werte außerhalb dieser Beschränkung kommen Rundungsregeln zum Einsatz. Der FLOAT-Wert wird in beiden Zeilen zum Näherungswert
1.
Verwenden von DECFLOAT-Werten mit Aggregatfunktionen¶
Im folgenden Beispiel werden DECFLOAT-Werte mit Aggregatfunktionen verwendet:
Erstellen Sie eine Tabelle, und fügen Sie dann DECFLOAT Werte in die Tabelle ein:
CREATE OR REPLACE TABLE decfloat_agg_sample (decfloat_val DECFLOAT); INSERT INTO decfloat_agg_sample VALUES (DECFLOAT '1e1000'), (DECFLOAT '-2.47e999'), (DECFLOAT '22e-75');
Fragen Sie die Tabelle mit einigen Aggregatfunktionen ab:
SELECT SUM(decfloat_val), AVG(decfloat_val), MAX(decfloat_val), MIN(decfloat_val) FROM decfloat_agg_sample;
+-------------------+-------------------+-------------------+-------------------+ | SUM(DECFLOAT_VAL) | AVG(DECFLOAT_VAL) | MAX(DECFLOAT_VAL) | MIN(DECFLOAT_VAL) | |-------------------+-------------------+-------------------+-------------------| | 7.53e999 | 2.51e999 | 1e1000 | -2.47e999 | +-------------------+-------------------+-------------------+-------------------+
Numerische Konstanten¶
The term constants — also known as literals — refers to fixed data values. The following formats are supported for numeric constants:
[+-][digits][.digits][e[+-]digits]
Wobei:
+oder-für einen positiven bzw. negativen Wert steht. Der Standard ist positiv.digitsbesteht aus einer oder mehrere Ziffern von 0 bis 9.e(oderE) 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