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).

Da es sich bei der Genauigkeit um die Gesamtzahl der zulässigen Ziffern handelt, können Sie keinen Wert in eine NUMBER-Spalte laden, wenn die Anzahl der Ziffern links vom Dezimalpunkt die Genauigkeit der Spalte abzüglich ihrer Skalierung überschreitet. Zum Beispiel erlaubt NUMBER(20, 2) 18 Ziffern auf der linken Seite des Dezimalpunkts und zwei Ziffern auf der rechten Seite des Dezimalpunkts, also insgesamt 20.

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.

It might be possible to avoid these types of approximation errors by using the exact DECFLOAT data type.

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.

DECFLOAT

The decimal float (DECFLOAT) data type stores numbers exactly, with up to 38 significant digits of precision, and uses a dynamic base-10 exponent to represent very large or small values. The exponent range is from -16383 to 16384, allowing values roughly between -10^(16384) and 10^(16384). The DECFLOAT data type supports a variable scale so that the scale varies depending on the specific value being stored. In contrast to the FLOAT data type, which represents values as approximations, the DECFLOAT data type represents exact values in the specified precision.

The DECFLOAT data type doesn’t support the following special values that are supported by the FLOAT data type: 'NaN' (not a number), 'inf' (infinity), and '-inf' (negative infinity).

Use cases for the DECFLOAT data type

Use the DECFLOAT data type when you need exact decimal results and a wide, variable scale in the same column.

The DECFLOAT data type is appropriate for the following general use cases:

  • You are ingesting data, and the scale of incoming numeric values is unknown or highly variable.

  • You require exact numeric values; for example, ledgers, taxes, or compliance.

  • You are migrating from systems that rely on the IEEE 754-decimal representation or 128-bit decimals. These migrations might be blocked by the precision or range limitations of other Snowflake data types.

  • You want to avoid Number out of representable range errors when you sum, multiply, or divide high-precision numeric values.

For example, you can use the DECFLOAT data type for the following specific use cases:

  • You are ingesting heterogeneously-scaled data from Oracle DECIMAL or DB2 DECFLOAT columns.

  • You are performing financial modeling involving computations with scales of results that are hard to predict.

  • You are running scientific measurements that swing from nano units to astronomical units.

You can continue to use the NUMBER data type for fixed-scale numeric columns or the FLOAT data type for high-throughput analytics where imprecise results are acceptable.

Usage notes for the DECFLOAT data type

  • If an operation produces a result with more than 38 digits, the DECFLOAT value is rounded to 38-digit precision, with the least-significant digits rounded off according to the current rounding mode. Snowflake uses the half up rounding mode for DECFLOAT values.

  • When specifying a DECFLOAT value or casting to a DECFLOAT value, avoid using numeric literals in SQL. If you do this, the values are interpreted as NUMBER or FLOAT values before being cast to a DECFLOAT value, which can result in range errors or loss of exactness. Use either string literals — such as SELECT '<value>'::DECFLOAT — or the DECFLOAT literal — such as SELECT DECFLOAT '<value>'.

  • When operations mix DECFLOAT values and values of other numeric types, coercion prefers the DECFLOAT values. For example, when adding a value of NUMBER type and DECFLOAT type, the result is a DECFLOAT value.

  • Use of the DECFLOAT type might cause storage consumption to increase.

Drivers and driver versions that support the DECFLOAT data type

The following Snowflake drivers and driver versions support the DECFLOAT data type. You might need to update your drivers to the versions that support DECFLOAT:

Driver

Minimum supported version

Notes

Snowflake Connector for Python

3.14.1

pandas DataFrames don’t support the DECFLOAT type.

ODBC

3.12.0

JDBC

3.27.0

Go Snowflake Driver

1.17.0

Unsupported drivers treat DECFLOAT values as TEXT values. For some drivers, a driver parameter must be set to map the DECFLOAT type to a language-native type. For more information, see Treiber.

Limitations for the DECFLOAT data type

The following limitations apply to the DECFLOAT type:

  • DECFLOAT values can’t be stored in VARIANT, OBJECT, or ARRAY values. To cast a DECFLOAT value to a VARIANT value, you can first cast it to a VARCHAR value and then to a VARIANT value.

  • DECFLOAT values aren’t supported in the following types of tables:

    • Tables in external formats, such as Iceberg

    • Hybrid tables

  • The DECFLOAT data type isn’t supported in Snowflake Scripting stored procedures. However, it is supported in Snowflake Scripting user-defined functions (UDFs).

  • The DECFLOAT data type isn’t supported in stored procedures or UDFs written in a language other than SQL (such as Python or Java).

  • The DECFLOAT data type isn’t supported in Snowpark.

  • Snowsight has limited support for the DECFLOAT data type.

  • The following features don’t support the DECFLOAT data type:

  • The NUMBER and FLOAT types might provide better performance than the DECFLOAT type.

Examples for the DECFLOAT data type

The following examples use the DECFLOAT data type:

Show the differences between DECFLOAT and FLOAT

Create a table with a DECFLOAT column and a FLOAT column, and insert the same values for both types into the table:

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
  );
Copy

The statement inserts DECFLOAT values in the following ways:

  • The first value is inserted by using the DECFLOAT literal.

  • The second value is inserted by casting an INTEGER value to a DECFLOAT value.

  • The last three values are inserted by casting a VARCHAR value to a DECFLOAT value.

Describe the table to show the types. The precision wasn’t specified in the table definition for either column, but the output shows that the DECFLOAT data type supports up to 38 significant digits of precision:

DESC TABLE decfloat_sample;
Copy
+--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| 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           |
+--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

Query the table to show the differences in the values:

SELECT * FROM decfloat_sample;
Copy
+----+-----------------------------------------+------------------------+
| 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                    |
+----+-----------------------------------------+------------------------+

The output shows the following differences:

  • The first row shows that the DECFLOAT type supports a wider range of values than the FLOAT type. The DECFLOAT value is very large (1.23e7002). The FLOAT value is inf, which means that the value is larger than any value that the FLOAT type can represent.

  • The second row shows that the DECFLOAT type retains the specified value exactly. The FLOAT value is an approximation that is stored in scientific notation.

  • The third row shows that the DECFLOAT type supports very small values (-4.2e-5432). The FLOAT value is approximated to -0.

  • The fourth and fifth rows show that the DECFLOAT type supports up to 38 digits of precision and uses rounding rules for values beyond the limit. The FLOAT value is approximated to 1 in both rows.

Use DECFLOAT values with aggregate functions

The following example uses DECFLOAT values with aggregate functions. First, create a table and insert DECFLOAT values:

CREATE OR REPLACE TABLE decfloat_agg_sample (decfloat_val DECFLOAT);

INSERT INTO decfloat_agg_sample VALUES
  (DECFLOAT '1e1000'),
  (DECFLOAT '-2.47e999'),
  (DECFLOAT '22e-75');
Copy

Query the table by using some aggregate functions:

SELECT SUM(decfloat_val),
       AVG(decfloat_val),
       MAX(decfloat_val),
       MIN(decfloat_val)
  FROM decfloat_agg_sample;
Copy
+-------------------+-------------------+-------------------+-------------------+
| SUM(DECFLOAT_VAL) | AVG(DECFLOAT_VAL) | MAX(DECFLOAT_VAL) | MIN(DECFLOAT_VAL) |
|-------------------+-------------------+-------------------+-------------------|
| 7.53e999          | 2.51e999          | 1e1000            | -2.47e999         |
+-------------------+-------------------+-------------------+-------------------+

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