Tipi di dati testuali: CHAR, VARCHAR, TEXT
Quando si parla di lavorare con dati testuali in PostgreSQL, abbiamo tre protagonisti principali: CHAR, VARCHAR e TEXT. Ognuno ha le sue particolarità, vantaggi e sfumature. Vediamo insieme come funzionano.
CHAR(n)
CHAR, o character, rappresenta una stringa di lunghezza fissa n. Se la stringa contiene meno caratteri di quelli specificati, viene automaticamente riempita con spazi.
Esempio:
| id | codice - CHAR(5) |
|---|---|
| 1 | ''ABC'' |
Questo tipo è comodo quando tutte le stringhe devono avere la stessa lunghezza (tipo codici, codici a barre o identificatori di lunghezza fissa).
Ma se lavori con testo di lunghezza variabile, gli spazi aggiuntivi occupano solo spazio inutile nel database.
VARCHAR(n)
VARCHAR, o variable character, serve per salvare stringhe di lunghezza variabile con un limite massimo di n caratteri.
Esempio:
| id | username - VARCHAR(10) |
|---|---|
| 1 | ''Alice'' |
Questo tipo usa lo spazio in modo efficiente, perché salva solo il testo reale. Lo svantaggio è che devi specificare il limite di lunghezza. Se la stringa supera il limite, il database ti darà errore.
TEXT
TEXT è un tipo di dato testuale senza limiti di lunghezza. Si usa spesso quando non sai quanto può diventare lungo il testo.
Esempio:
| id | contenuto - TEXT |
|---|---|
| 1 | ''Questo è un testo lungo. Nessun limite!'' |
Vantaggi: puoi salvare testi di qualsiasi lunghezza senza preoccuparti dei limiti.
Svantaggi: l'assenza di limiti può portare a un uso inefficiente del database se i dati testuali iniziano a "gonfiarsi".
Confronto tra tipi di dati testuali
Quando lavori con il testo, è importante capire quale tipo di dato è adatto per ogni caso. Ecco le differenze principali tra CHAR, VARCHAR e TEXT:
| Tipo di dato | Lunghezza | Performance | Quando usarlo? |
|---|---|---|---|
CHAR(n) |
Fissa | Più veloce per stringhe di lunghezza fissa | Per codici di lunghezza fissa (tipo ISO) |
VARCHAR(n) |
Lunghezza massima n |
Più veloce di TEXT se c'è un limite |
Per stringhe di lunghezza variabile con un massimo noto |
TEXT |
Illimitata | Il più versatile | Per testi lunghi di cui non puoi prevedere la lunghezza |
Esempi pratici di utilizzo
Ok, vediamo come usare questi tipi di dati in scenari reali.
Esempio 1: Usare CHAR per codici di lunghezza fissa
Immagina di lavorare con un database dove devi salvare i codici delle città secondo lo standard ISO 3166-1 alpha-3. Ogni codice deve avere esattamente 3 caratteri.
| city_id | city_name - VARCHAR(50) | iso_code - CHAR(3) |
|---|---|---|
| 1 | New York | NYC |
| 2 | Los Angeles | LAX |
| 3 | Chicago | CHI |
Qui CHAR(3) è perfetto, perché ogni codice ISO della città ha lunghezza fissa.
Esempio 2: Usare VARCHAR per i nomi utente
Il nome utente è un ottimo caso per VARCHAR. Di solito ha lunghezza variabile, ma possiamo supporre che non supererà mai 50 caratteri.
| user_id | username - VARCHAR(50) | email - VARCHAR(50) |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
VARCHAR in questo caso risparmia spazio, perché la lunghezza reale della stringa può essere inferiore a 50 caratteri.
Esempio 3: Usare TEXT per salvare descrizioni
Immagina di avere un blog dove per ogni post devi salvare una lunga descrizione testuale. Qui la scelta migliore è TEXT.
| post_id | title - VARCHAR(100) | content - TEXT |
|---|---|---|
| 1 | Post 1 | Questo è un contenuto molto lungo di un post del blog che continua e continua... |
Se non sai mai in anticipo quanto sarà lungo il testo, TEXT è perfetto.
4. Altri dettagli e trappole
Lavorando con tipi di dati testuali ci sono alcune cose da tenere a mente per evitare errori tipici.
Problema: CHAR aggiunge spazi
Se provi a confrontare stringhe in un campo CHAR senza considerare gli spazi aggiunti, potresti avere risultati inaspettati.
SELECT * FROM cities WHERE iso_code = 'NYC';
-- Non ritorna nulla se non togli gli spazi
Come risolvere: Usa la funzione TRIM() per togliere gli spazi.
SELECT * FROM cities WHERE TRIM(iso_code) = 'NYC';
Problema: I limiti di lunghezza in VARCHAR possono causare errori
Se provi a inserire in un campo VARCHAR una stringa che supera il massimo, il database ti darà errore.
INSERT INTO users (username, email) VALUES ('A_username_that_is_too_long_for_field', 'test@example.com');
-- Errore
Come risolvere: Assicurati che il limite di lunghezza (n) sia adatto alle tue esigenze reali. Oppure usa TEXT per evitare limiti.
Problema: TEXT può gonfiare il tuo database
TEXT salva dati illimitati, il che può far crescere troppo le tabelle e rendere più difficile l'indicizzazione.
Come evitarlo: Se pensi di indicizzare spesso una colonna TEXT, valuta di usare un VARCHAR limitato.
GO TO FULL VERSION