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.

Dans ce chapitre :

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.-à-d. NUMBER(38, 0)). Notez que 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).

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 la forme 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 DOUBLE (qui a une précision d’environ 17 chiffres décimaux), puis en NUMBER.

DECIMAL , 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, etc.) 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. En d’autres termes, 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 cette plage pour stocker toutes les valeurs pour cette colonne dans la partition. Par exemple :

  • Si une colonne contient 5 valeurs (par exemple 0, 1, 2, 3, 4), chacune des valeurs consomme 1 octet (non compressé ; la taille réelle de stockage est réduite par la compression).

  • Si une colonne contient des valeurs plus longues (par exemple 0, 1, 2, 3, 4, 10000000), chacune des valeurs consomme 4 octets (non compressé).

Cependant, l’échelle (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.

Exemples de types de données à point fixe dans une table

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

Types de données pour les nombres à virgule flottante

Snowflake prend en charge les types de données suivants pour les nombres à virgule flottante.

FLOAT , FLOAT4 , FLOAT8

Snowflake utilise des nombres à virgule flottante à double précision (64 bits) IEEE 754.

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

'NaN' = 'NaN'

TRUE

FALSE

Dans Snowflake, les valeurs 'NaN' sont toutes égales.

'NaN' > X .X est une valeur FLOAT, y compris un infini . (autre que NaN lui-même).

TRUE

FALSE

Snowflake considère 'NaN' comme un . supérieur à toute autre valeur FLOAT, . y compris l’infini.

DOUBLE , DOUBLE PRECISION , REAL

Synonyme de FLOAT.

Exemples de types de données en virgule flottante dans une table

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

Note

Les colonnes DOUBLE, FLOAT, DOUBLE PRECISION et REAL sont affichées comme FLOAT, mais stockées comme DOUBLE. C’est un problème connu dans Snowflake.

Constantes numériques

Les constantes (aussi connues sous le nom de litéraux) font 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.

  • digits est un ou plusieurs chiffres de 0 à 9.

  • e (ou E) 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