7
Chapitre 7 sur 21

Les types de données SQL

Choisissez le bon “format” pour chaque colonne : texte, nombres, dates, booléens… Un bon type = moins d’erreurs, des recherches plus fiables et une base plus propre.

Pourquoi les types de données sont essentiels

Une table, c’est une structure… mais chaque colonne doit aussi savoir quel genre de valeur elle accepte. C’est exactement le rôle des types de données.

📦

Analogie du jour : Des boîtes de rangement

Imaginez que chaque colonne est une boîte. Une boîte “TEXT” accepte des mots, une boîte “INTEGER” accepte des nombres entiers, une boîte “DATE” accepte des dates. Si vous mettez une mauvaise chose dans la mauvaise boîte, vous créez des bugs et des données incohérentes.

📖

Définition : Type de données

Un type de données définit la nature d’une valeur stockée dans une colonne (texte, nombre, date, etc.) et influence les contrôles, les comparaisons et les tri.

Objectif du chapitre

À la fin, vous saurez choisir rapidement le bon type pour une colonne, et éviter les pièges classiques (dates en texte, nombres stockés en texte, etc.).

Les types les plus utilisés (à connaître en priorité)

Il existe beaucoup de variantes selon le moteur (SQLite, MySQL, PostgreSQL…). Pour débuter, retenez surtout ces grandes familles :

🔤

TEXT
Indispensable

Pour : noms, prénoms, emails, villes, descriptions, catégories…

Exemple : nom TEXT, email TEXT

-- Exemple : un champ texte
nom TEXT NOT NULL
🔢

INTEGER
Indispensable

Pour : âges, quantités, nombres de pages, identifiants, année…

Exemple : age INTEGER, stock INTEGER

-- Exemple : un entier
stock INTEGER DEFAULT 0
💶

REAL / DECIMAL
Très courant

Pour : prix, notes, mesures (ex : 12.5).

Exemple : prix REAL

-- Exemple : un nombre décimal
prix REAL NOT NULL
📅

DATE / DATETIME
Très utile

Pour : date d’inscription, date de naissance, date/heure de commande…

Exemple : date_inscription DATE

-- Exemple : une date
date_inscription DATE
⚠️

Piège classique

Mettre un nombre (prix, quantité, année) dans une colonne TEXT “par facilité” est une mauvaise habitude. Vous aurez ensuite des tris absurdes (ex : 100 avant 20) et des comparaisons incohérentes.

Comment choisir le bon type (méthode simple)

Pour débuter, posez-vous ces questions dans l’ordre. C’est volontairement “mécanique” : ça évite les hésitations.

1

Est-ce que c’est du texte (mots, phrases) ?

Oui → TEXT

Exemples : nom, prénom, email, ville, catégorie, description.

2

Est-ce que c’est un nombre entier (sans virgule) ?

Oui → INTEGER

Exemples : stock, âge, année, nombre de pages, identifiant.

3

Est-ce que c’est un nombre avec virgule ?

Oui → REAL (ou DECIMAL selon le SGBD)

Exemples : prix, notes, mesures (poids, taille).

4

Est-ce que c’est une date (ou date + heure) ?

Oui → DATE ou DATETIME

Exemples : date d’inscription, date/heure de commande.

💡

Règle pratique

Si vous hésitez entre TEXT et un type numérique : demandez-vous si vous allez faire des calculs, des comparaisons numériques, des tris numériques. Si oui, utilisez un type numérique.

Exemple concret : table “produits” bien typée

On reprend un exemple réaliste (e-commerce / restaurant) et on choisit un type cohérent pour chaque colonne.

CREATE TABLE produits (
    id INTEGER PRIMARY KEY,
    nom TEXT NOT NULL,
    description TEXT,
    prix REAL NOT NULL,
    stock INTEGER DEFAULT 0,
    actif BOOLEAN DEFAULT TRUE,
    date_creation DATE
);
🧠

Pourquoi “prix” en REAL ?

Parce qu’un prix peut avoir des décimales (ex : 12.50).

Et vous pourrez faire des calculs (total commande, TVA, etc.).

📦

Pourquoi “stock” en INTEGER ?

Parce que le stock est une quantité entière.

En plus, on met une valeur par défaut : 0.

Pourquoi “actif” en BOOLEAN ?

Pour activer/désactiver un produit sans le supprimer.

Et “TRUE” par défaut pour les nouveaux produits.

📅

Pourquoi “date_creation” ?

Parce qu’une date sert souvent au tri, à l’historique, aux statistiques.

Ne stockez pas une date en texte “au hasard” (ex : “12/01/2025”).

Cas fréquents : email, téléphone, code postal…

Certains champs ressemblent à des nombres, mais ne doivent pas être traités comme des nombres. Voici les décisions les plus “pro” à adopter dès le début.

✉️

Email

Type conseillé : TEXT

Bonne pratique : UNIQUE (si un email = un compte).

email TEXT UNIQUE
📞

Téléphone

Type conseillé : TEXT

Pourquoi ? Parce qu’il peut contenir +, des espaces, et des zéros au début.

telephone TEXT
🏷️

Code postal

Type conseillé : TEXT

Parce que ce n’est pas un nombre pour calculer. Et certains pays ont des lettres.

code_postal TEXT
🔖

Statut / catégorie

Type conseillé : TEXT

Ex : “en_attente”, “valide”, “annule”.

statut TEXT DEFAULT 'en_attente'
⚠️

Attention aux zéros au début

Un code postal “06700” stocké en INTEGER deviendra “6700”. Vous perdez l’information. C’est une raison majeure d’utiliser TEXT pour certains “codes”.

Erreurs courantes et comment les éviter

Mettre des nombres dans TEXT

Symptôme : tri incohérent (100 avant 20), comparaisons étranges.

Solution : utilisez INTEGER ou REAL selon le cas.

Mettre des dates “à la main” en texte

Symptôme : impossible de filtrer facilement par date, formats différents (12/01/2025 vs 2025-01-12).

Solution : stockez une DATE (ou un format standard) et gardez un format cohérent.

Choisir un type “au hasard”

Symptôme : vous modifiez la table souvent, ou vous contournez en mettant tout en texte.

Solution : appliquez la méthode simple du chapitre (texte vs entier vs décimal vs date).

🛠️

Astuce de débogage

Quand “quelque chose ne marche pas” (tri, calcul, filtre), vérifiez d’abord le type de la colonne. Dans beaucoup de cas, le problème vient d’une colonne en TEXT alors qu’elle devrait être numérique.

Exercice pratique : typer correctement 3 tables

Dans votre base exercices.db, créez 3 tables en respectant les types. Prenez 10 minutes et faites-le “propre”.

1

Table “utilisateurs”

  • id (clé primaire)
  • nom (obligatoire)
  • email (unique)
  • telephone (texte)
  • date_inscription (date)
  • actif (booléen, true par défaut)
2

Table “commandes”

  • id (clé primaire)
  • total (décimal)
  • date_commande (date/heure)
  • statut (texte : “en_attente”, “valide”, “annule”)
3

Table “avis”

  • id (clé primaire)
  • note (entier, de 1 à 5)
  • commentaire (texte)
  • date_avis (date)
💡

Solution (table “utilisateurs”)

CREATE TABLE utilisateurs (
    id INTEGER PRIMARY KEY,
    nom TEXT NOT NULL,
    email TEXT UNIQUE,
    telephone TEXT,
    date_inscription DATE,
    actif BOOLEAN DEFAULT TRUE
);

Vérification des connaissances

Question 1

Pourquoi éviter de stocker un prix en TEXT ?

  • Tri incohérent (texte ≠ nombre)
  • Calculs difficiles ou incorrects
  • Comparaisons “bizarres”

Question 2

Téléphone : INTEGER ou TEXT ? Pourquoi ?

  • TEXT (peut contenir +, espaces, zéros initiaux)
  • Ce n’est pas une valeur à additionner

Question 3

Quel type pour une quantité de stock ?

  • INTEGER (nombre entier)
  • DEFAULT 0 est une bonne pratique

Récapitulatif du chapitre

Vous avez maintenant appris :

  • Ce qu’est un type de données et pourquoi c’est crucial
  • Les types les plus utilisés : TEXT, INTEGER, REAL, DATE/DATETIME, BOOLEAN
  • Une méthode simple pour choisir le bon type
  • Des décisions “pro” pour les champs piégeux (téléphone, code postal)
  • Les erreurs classiques et comment les éviter
  • Un exercice de création de tables en respectant les types

Dans le prochain chapitre, vous allez enfin insérer des données dans vos tables avec INSERT.