Quand on parle de manipuler des données texte dans PostgreSQL, on a trois stars principales : CHAR, VARCHAR et TEXT. Chacun a ses propres particularités, avantages et subtilités. On va voir ça ensemble, tranquille.
CHAR(n)
CHAR, ou character, c’est une chaîne de longueur fixe n. Si ta chaîne fait moins de caractères que prévu, elle est automatiquement complétée avec des espaces.
Exemple :
| id | code - CHAR(5) |
|---|---|
| 1 | ''ABC'' |
Ce type est super pratique quand toutes les chaînes doivent avoir la même longueur (genre des codes, des codes-barres ou des identifiants à taille fixe).
Mais si tu bosses avec du texte de longueur variable, les espaces ajoutés ne font que gaspiller de la place dans la base.
VARCHAR(n)
VARCHAR, ou variable character, sert à stocker des chaînes de longueur variable avec une limite max de n caractères.
Exemple :
| id | username - VARCHAR(10) |
|---|---|
| 1 | ''Alice'' |
Ce type utilise l’espace efficacement, car il ne garde que le texte réel. Par contre, il faut bien penser à la limite de longueur. Si tu dépasses, la base va te balancer une erreur.
TEXT
TEXT — c’est un type de chaîne sans aucune limite de longueur. On l’utilise souvent quand on ne sait pas jusqu’où le texte peut aller.
Exemple :
| id | content - TEXT |
|---|---|
| 1 | ''Ceci est un long texte. Pas de limites !'' |
Avantages : tu peux stocker des textes de n’importe quelle taille sans te prendre la tête avec des limites.
Inconvénients : l’absence de limites peut rendre ta base moins efficace si les données texte deviennent énormes.
Comparaison des types de données textuelles
Quand tu bosses avec du texte, c’est important de piger quel type de données est le plus adapté à ton cas. Voilà les différences principales entre CHAR, VARCHAR et TEXT :
| Type de données | Longueur | Performance | Quand l’utiliser ? |
|---|---|---|---|
CHAR(n) |
Fixe | Plus rapide pour des chaînes de longueur fixe | Pour des codes à longueur fixe (genre ISO) |
VARCHAR(n) |
Longueur max n |
Plus rapide que TEXT si tu mets une limite |
Pour des chaînes de longueur variable avec un max connu |
TEXT |
Illimitée | Le plus polyvalent | Pour des textes longs dont la taille est imprévisible |
Exemples pratiques d’utilisation
Allez, voyons comment utiliser ces types de données dans des cas concrets.
Exemple 1 : Utiliser CHAR pour des codes à longueur fixe
Imagine que tu bosses sur une base où tu dois stocker des codes de villes selon la norme ISO 3166-1 alpha-3. Chaque code doit faire exactement 3 caractères.
| city_id | city_name - VARCHAR(50) | iso_code - CHAR(3) |
|---|---|---|
| 1 | New York | NYC |
| 2 | Los Angeles | LAX |
| 3 | Chicago | CHI |
Ici, CHAR(3) est parfait, vu que chaque code ISO de ville a une longueur fixe.
Exemple 2 : Utiliser VARCHAR pour les noms d’utilisateur
Le nom d’utilisateur, c’est typiquement un bon cas pour VARCHAR. En général, c’est variable, mais tu sais que ça ne dépassera pas 50 caractères.
| user_id | username - VARCHAR(50) | email - VARCHAR(50) |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
VARCHAR ici permet de gagner de la place, vu que la longueur réelle de la chaîne est souvent inférieure à 50 caractères.
Exemple 3 : Utiliser TEXT pour stocker des descriptions
Imagine que tu as un blog, et que chaque post doit avoir une grosse description texte. Là, TEXT est le choix idéal.
| post_id | title - VARCHAR(100) | content - TEXT |
|---|---|---|
| 1 | Post 1 | Ceci est un contenu de blog très long qui continue encore et encore... |
Si tu ne sais jamais à l’avance la taille du texte, TEXT est parfait.
4. Détails supplémentaires et pièges à éviter
Quand tu bosses avec des types de données texte, y’a quelques trucs à savoir pour éviter les galères classiques.
Problème : CHAR ajoute des espaces
Si tu compares des chaînes dans un champ CHAR sans tenir compte des espaces ajoutés, tu risques d’avoir des résultats bizarres.
SELECT * FROM cities WHERE iso_code = 'NYC';
-- Rien ne sera retourné si tu ne vires pas les espaces
Comment corriger : Utilise la fonction TRIM() pour enlever les espaces.
SELECT * FROM cities WHERE TRIM(iso_code) = 'NYC';
Problème : Les limites de longueur dans VARCHAR peuvent causer des erreurs
Si tu essaies d’insérer dans un champ VARCHAR une chaîne trop longue, la base va te jeter une erreur.
INSERT INTO users (username, email) VALUES ('Un_nom_utilisateur_trop_long_pour_le_champ', 'test@example.com');
-- Erreur
Comment corriger : Vérifie que la limite (n) colle à tes besoins réels. Ou alors utilise TEXT pour ne pas te prendre la tête avec les limites.
Problème : TEXT peut faire gonfler ta base
TEXT stocke des données sans limite, ce qui peut faire grossir tes tables et compliquer l’indexation.
Comment éviter : Si tu comptes indexer à fond une colonne TEXT, pense à utiliser un VARCHAR limité à la place.
GO TO FULL VERSION