Types de données numériques¶
Cette rubrique décrit les types de données numériques pris en charge dans Snowflake, ainsi que les formats pris en charge pour les constantes/littéraux numériques.
Types de données pour les numéros à virgule fixe¶
Snowflake prend en charge les types de données suivants pour les nombres à virgule fixe.
NUMBER¶
Nombres jusqu’à 38 chiffres, avec une précision et une échelle facultatives :
- Précision:
Nombre total de chiffres permis.
- Échelle:
Nombre de chiffres autorisés à droite de la virgule décimale.
Par défaut, la précision est 38 et l’échelle est 0 (c’est-à-dire NUMBER(38,0)). La précision limite la plage des valeurs qui peuvent être insérées (ou converties et insérées) dans les colonnes d’un type donné. Par exemple, la valeur 999 correspond à NUMBER(38,0) mais pas à NUMBER(2,0).
La précision correspondant au nombre total de chiffres autorisés, vous ne pouvez pas charger une valeur dans une colonne NUMBER si le nombre de chiffres à gauche de la virgule décimale dépasse la précision de la colonne moins son échelle. Par exemple, NUMBER(20, 2) autorise 18 chiffres à gauche de la virgule et deux chiffres à droite de la virgule, pour un total de 20.
L’échelle maximale (nombre de chiffres à droite du séparateur décimal) est 37. Les nombres qui ont moins de 38 chiffres significatifs, mais dont le chiffre le moins significatif se trouve au-delà de la 37e décimale, par exemple 0,0000000000000000000000000000000000000012 (1,2e -39), ne peuvent pas être représentés sans perdre quelques chiffres de précision.
Note
Si les données sont converties dans un autre type de données avec une précision moindre, puis de nouveau dans le type de données de précision plus élevée, les données peuvent perdre en précision. Par exemple, vous perdez en précision si vous convertissez une valeur NUMBER(38,37) en valeur DOUBLE (qui a une précision d’environ 15 chiffres décimaux), puis en NUMBER.
Snowflake prend également en charge le type de données FLOAT , qui permet une plus grande plage de valeurs, mais avec moins de précision.
DECIMAL , DEC , NUMERIC¶
Synonyme de NUMBER.
INT , INTEGER , BIGINT , SMALLINT , TINYINT , BYTEINT¶
Synonymes de NUMBER, sauf que la précision et l’échelle ne peuvent pas être spécifiées (c’est-à-dire que la valeur par défaut est toujours NUMBER(38,0)). Par conséquent, pour tous les types de données INTEGER, la plage de valeurs comprend toutes les valeurs entières de -99999999999999999999999999999999999999 à +99999999999999999999999999999999999999 (inclus).
Les différents noms (TINYINT, BYTEINT, et ainsi de suite) visent à simplifier le portage à partir d’autres systèmes et à suggérer la plage de valeurs attendue pour une colonne du type spécifié.
Impact de la précision et de l’échelle sur la taille de stockage¶
La précision (nombre total de chiffres) n’a pas d’incidence sur le stockage. Les exigences de stockage pour le même nombre de colonnes dans des colonnes de précision différente, telles que NUMBER(2,0) et NUMBER(38,0), sont identiques. Pour chaque micro-partition, Snowflake détermine les valeurs minimales et maximales pour une colonne donnée et utilise ces informations pour déterminer la taille de stockage de toutes les valeurs pour cette colonne dans la partition. Par exemple :
Si une colonne ne contient que des valeurs comprises entre
-128et+127, chacune de ces valeurs consomme 1 octet (non compressé).Si la plus grande valeur de la colonne est
10000000, alors chacune des valeurs consomme 4 octets (non compressés).
Cependant, l’échelle (le nombre de chiffres après la virgule décimale) a un impact sur le stockage. Par exemple, la même valeur stockée dans une colonne de type NUMBER(10,5) consomme plus d’espace que NUMBER(5,0). De plus, le traitement de valeurs ayant une plus grande échelle pourrait être légèrement plus lent et consommer plus de mémoire.
Pour économiser de l’espace, Snowflake compresse les valeurs avant de les écrire dans le stockage. Le degré de compression dépend de la valeur des données et d’autres facteurs.
Exemples de types de données à point fixe dans une table¶
L’instruction suivante crée une table avec des colonnes de différents types de données à point fixe :
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 |
+-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
Types de données pour les numéros en virgule flottante¶
Snowflake prend en charge les types de données suivants pour les nombres à virgule flottante.
FLOAT , FLOAT4 , FLOAT8¶
Les noms FLOAT, FLOAT4 et FLOAT8 sont utilisés à des fins de compatibilité avec d’autres systèmes. Snowflake les traite tous les trois comme des nombres à virgule flottante de 64 bits.
Précision¶
Snowflake utilise des nombres à virgule flottante de double précision (bit64) IEEE 754.
La précision est d’environ 15 chiffres. Par exemple, pour les entiers, la plage est de -9007199254740991 à +9007199254740991 (-253 + 1 à +253 - 1). Les valeurs à virgule flottante peuvent aller d’environ 10-308 à 10+308. (Snowflake peut représenter des valeurs plus extrêmes comprises approximativement entre 10-324 et 10-308 avec moins de précision.) Pour plus de détails, voir l’article de Wikipédia sur les numéros à double précision.
Snowflake prend en charge le type de données à point fixe NUMBER, qui permet une plus grande précision, bien que la gamme des exposants soit plus petite.
Valeurs spéciales¶
Snowflake prend en charge les valeurs spéciales suivantes pour FLOAT :
'NaN'(Pas un nombre)'inf'(infini)'-inf'(infini négatif)
Les symboles 'NaN', 'inf' et '-inf' doivent être entre guillemets simples et sont sensibles à la casse.
La sémantique de comparaison pour 'NaN' diffère de la norme IEEE 754 des manières suivantes :
Condition |
Snowflake |
IEEE 754 |
Commentaire |
|---|---|---|---|
|
|
|
Dans Snowflake, les valeurs |
|
|
|
Dans Snowflake, |
Erreurs d’arrondi¶
Les opérations en virgule flottante peuvent présenter de petites erreurs d’arrondi dans les chiffres les moins significatifs. Les erreurs d’arrondi peuvent se produire dans tout type de traitement à virgule flottante, y compris les trigonométriques, statistiques et géospatiales.
Les considérations suivantes concernent les erreurs d’arrondi :
Les erreurs peuvent varier à chaque exécution de la requête.
Les erreurs peuvent être plus importantes lorsque les opérandes ont une précision ou une échelle différente.
Les erreurs peuvent s’accumuler, en particulier lorsque des fonctions agrégées (par exemple SUM ou AVG) traitent un grand nombre de lignes. Le fait d’utiliser un type de données à point fixe avant l’agrégation peut réduire ou éliminer ces erreurs.
Les erreurs d’arrondi peuvent se produire non seulement lors de l’utilisation de SQL, mais aussi lors de l’utilisation d’un autre code (par exemple, Java, JavaScript, ou Python) qui s’exécute dans Snowflake (par exemple, dans les UDFs et les procédures stockées).
Lorsque vous comparez deux nombres à virgule flottante, Snowflake recommande d’effectuer une comparaison pour une égalité approximative plutôt qu’une égalité exacte.
It might be possible to avoid these types of approximation errors by using the exact DECFLOAT data type.
DOUBLE , DOUBLE PRECISION , REAL¶
Synonyme de FLOAT.
Exemples de types de données à point flottant dans une table¶
L’instruction suivante crée une table avec des colonnes de divers types de données à virgule flottante :
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 |
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
Note
La colonne type de la commande DESCTABLE affiche le type de données FLOAT non seulement pour FLOAT, mais aussi pour les synonymes de FLOAT (par exemple, DOUBLE, DOUBLE PRECISION et REAL).
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 rangeerrors 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 asSELECT 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 Pilotes.
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
);
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;
+--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| 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;
+----+-----------------------------------------+------------------------+
| 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 isinf, 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
1in 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');
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;
+-------------------+-------------------+-------------------+-------------------+
| SUM(DECFLOAT_VAL) | AVG(DECFLOAT_VAL) | MAX(DECFLOAT_VAL) | MIN(DECFLOAT_VAL) |
|-------------------+-------------------+-------------------+-------------------|
| 7.53e999 | 2.51e999 | 1e1000 | -2.47e999 |
+-------------------+-------------------+-------------------+-------------------+
Constantes numériques¶
Le terme constantes (également appelées littéraux) fait référence à des valeurs de données fixes. Les formats suivants sont pris en charge pour les constantes numériques :
[+-][digits][.digits][e[+-]digits]
Où :
+ou-indique une valeur positive ou négative. La valeur par défaut est positive.digitsest un ou plusieurs chiffres de 0 à 9.e(ouE) indique un exposant dans la notation scientifique. Au moins un chiffre doit suivre le marqueur de l’exposant, s’il est présent.
Les chiffres suivants sont tous des exemples de constantes numériques prises en charge :
15
+1.34
0.2
15e-03
1.234E2
1.234E+2
-1