Aujourd'hui, on va parler des types de données numériques dans PostgreSQL. Si tu t'es déjà demandé comment stocker le nombre "42", faire des calculs financiers ou, genre, des millisecondes — t'es au bon endroit. On va voir quel type choisir pour chaque cas, histoire que toi et tes données soyez à l'aise.
Les types numériques dans PostgreSQL se divisent en trois grandes familles :
- Nombres entiers (
INTEGER) : pour stocker des nombres sans partie décimale. Genre les classiques 1, 42, -7. - Nombres exacts (
NUMERIC) : pour stocker des nombres avec un nombre fixe de chiffres après la virgule. Super utile pour les calculs financiers, où la précision c'est la vie. - Nombres à virgule flottante (
REAL) : pour stocker des nombres qui peuvent être énormes ou minuscules. Moins précis queNUMERIC, mais parfaits pour les calculs scientifiques.
Type INTEGER
INTEGER — c'est le type pour les nombres entiers. Parfait quand t'as besoin de stocker des nombres sans décimales. PostgreSQL propose trois variantes de INTEGER pour couvrir différents intervalles :
SMALLINT: petit entier. Intervalle : de -32 768 à 32 767.INTEGER(ouINT) : entier standard. Intervalle : de -2 147 483 648 à 2 147 483 647.BIGINT: pour les très grands nombres. Intervalle : de -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807.
Imaginons qu'on a une table students où on stocke des infos sur les étudiants : leur nom, âge et le nombre de crédits (points académiques) :
| id | name | age | credits |
|---|---|---|---|
| 1 | Otto Nate | 21 | 30 |
| 2 | Maria Chi | 22 | 45 |
| 3 | Peter Val | 20 | 60 |
| 4 | Anna Song | 23 | 50 |
| 5 | Sophie Zhang | 21 | 35 |
Maintenant, on fait une requête SQL simple pour avoir la liste des étudiants avec leur âge et le nombre de crédits :
SELECT name, age, credits
FROM students;
Résultat :
| name | age | credits |
|---|---|---|
| Otto Nate | 21 | 30 |
| Maria Chi | 22 | 45 |
| Peter Val | 20 | 60 |
| Anna Song | 23 | 50 |
| Sophie Zhang | 21 | 35 |
Quand utiliser INTEGER ?
- Pour stocker des identifiants (
id, numéro de commande). - Pour stocker des quantités (genre le nombre d'articles en stock, le nombre d'étudiants).
Type NUMERIC
NUMERIC — c'est le type pour les nombres exacts à virgule fixe. Si tu dois stocker un truc genre 123.456, et qu'une erreur sur un chiffre après la virgule peut te coûter ta réputation (ou ton fric), prends NUMERIC.
Format de déclaration : NUMERIC(precision, scale), où :
precision— nombre total de chiffres (avant et après la virgule).scale— nombre de chiffres après la virgule.
Par exemple, NUMERIC(6, 2) permet de stocker des nombres avec max 6 chiffres, dont 2 après la virgule.
Créons une table pour gérer les transactions financières :
| id | description | amount |
|---|---|---|
| 1 | Paiement pour les études | 2345.67 |
| 2 | Bourse mensuelle | 500.00 |
| 3 | Frais de laboratoire | 145.99 |
| 4 | Amende bibliothèque | 12.75 |
| 5 | Inscription à la conférence | 320.50 |
Maintenant, affichons la liste des transactions :
SELECT description, amount
FROM transactions;
Résultat :
| description | amount |
|---|---|
| Paiement pour les études | 2345.67 |
| Bourse mensuelle | 500.00 |
| Frais de laboratoire | 145.99 |
| Amende bibliothèque | 12.75 |
| Inscription à la conférence | 320.50 |
Quand utiliser NUMERIC ?
- Calculs financiers (prix des articles, salaires).
- Stocker des mesures précises (poids, longueur).
Table measurements
| id | mass - REAL | height - REAL |
|---|---|---|
| 1 | 70.5 | 1.83 |
| 2 | 64.2 | 1.75 |
| 3 | 82.3 | 1.92 |
| 4 | 55.0 | 1.60 |
Maintenant, affichons les valeurs :
SELECT mass, height
FROM measurements;
Résultat :
| mass | height |
|---|---|
| 70.5 | 1.83 |
| 64.2 | 1.75 |
| 82.3 | 1.92 |
| 55.0 | 1.60 |
Quand utiliser REAL ?
- Calculs scientifiques (masse des atomes, distance à la Lune).
- Modélisation de données où les erreurs sont acceptables.
Comparaison des types numériques : quand utiliser quoi ?
| Type de données | Intervalle | Précision | Exemples d'utilisation |
|---|---|---|---|
SMALLINT |
-32 768 à 32 767 | Nombres entiers | Petits nombres (âge, notes). |
INTEGER |
-2 147 483 648 à 2 147 483 647 | Nombres entiers | Identifiants, quantités. |
BIGINT |
-9 223 372 036 854 775 808 à 9 223 372 036 854 775 807 | Nombres entiers | Très grands nombres. |
NUMERIC |
Dépend de precision et scale |
Nombres décimaux exacts | Finance, mesures. |
REAL |
Environ 6 chiffres décimaux | Virgule flottante | Données approximatives ou scientifiques. |
DOUBLE PRECISION |
Environ 15 chiffres décimaux | Virgule flottante haute précision | Science, recherche. |
Alias
Dans PostgreSQL, beaucoup de types numériques ont des alias — c'est des noms alternatifs pour les types, qui se comportent pareil mais rendent le code plus lisible ou compatible avec d'autres SGBD.
Voilà un petit guide rapide sur les alias des types numériques dans PostgreSQL :
Alias pour les types entiers
| Alias | Type réel | Taille | Intervalle |
|---|---|---|---|
INT |
INTEGER |
4 octets | −2 147 483 648 à 2 147 483 647 |
INT4 |
INTEGER |
4 octets | (alias obsolète) |
SMALLINT |
SMALLINT |
2 octets | −32 768 à 32 767 |
INT2 |
SMALLINT |
2 octets | |
BIGINT |
BIGINT |
8 octets | −9 quintillions à +9 quintillions |
INT8 |
BIGINT |
8 octets |
Alias pour les nombres exacts
| Alias | Type réel | Utilisation |
|---|---|---|
DEC |
NUMERIC |
Synonyme selon le standard SQL |
DECIMAL |
NUMERIC |
Pareil |
Alias pour les nombres à virgule flottante
| Alias | Type réel | Précision |
|---|---|---|
FLOAT |
DOUBLE PRECISION |
~15 chiffres (par défaut) |
FLOAT(24) |
REAL |
~6 chiffres |
FLOAT(53) |
DOUBLE PRECISION |
~15 chiffres |
FLOAT8 |
DOUBLE PRECISION |
Alias obsolète |
FLOAT4 |
REAL |
Alias obsolète |
Erreurs classiques
Quand tu bosses avec les types numériques, tu peux tomber sur quelques pièges :
Choisir un type de données trop petit. Si tu utilises SMALLINT pour l'âge des gens, c'est pas ouf. Le robot de "Matrix" qui a des millions d'années va être vexé.
Perte de données à cause de l'arrondi. Si tu utilises REAL pour des calculs financiers, tu risques de perdre des centimes. Et après, la confiance des clients aussi.
Comparer des types différents. Si tu compares INTEGER et REAL, tu peux avoir des résultats chelous à cause de la façon dont les nombres à virgule flottante sont stockés.
GO TO FULL VERSION