In SQL esistono diversi tipi di dati principali: stringa (ad esempio, VARCHAR, CHAR, TEXT), numerici (INT, DECIMAL, FLOAT), data e ora (DATE, TIMESTAMP). È molto importante scegliere il tipo più piccolo e appropriato per i dati specifici, per risparmiare spazio e ottimizzare l'indicizzazione. Un errore comune è scegliere un tipo con una lunghezza eccessiva (ad esempio, VARCHAR(255) invece di VARCHAR(50)), il che può portare a costi delle risorse non necessari.
Un'altra differenza importante riguarda i tipi numerici: FLOAT memorizza valori approssimativi, mentre DECIMAL memorizza valori esatti, utile per le operazioni finanziarie. Il confronto di stringhe di diverse codifiche, ad esempio, può dare risultati inaspettati se non si considera il COLLATE.
Esempio:
-- Esempio di lavoro con incompatibilità dei tipi declare @price varchar(10) = '100.99'; select @price + 1; -- Errore: impossibile sommare una stringa e un numero -- Senza una conversione esplicita dei tipi non funzionerà
Domanda: Cosa succede se si confronta un campo di tipo VARCHAR con un numero? Ad esempio: WHERE code = 123? L'indice funzionerà rapidamente?
Risposta: SQL cercherà di convertire il numero in una stringa e confrontarlo come stringhe. Tuttavia, se su quel campo è stato costruito un indice numerico, non verrà utilizzato durante il confronto delle stringhe e la query rallenterà. È consigliabile utilizzare sempre un tipo di dato rigoroso e una conversione esplicita, se necessario.
Esempio:
SELECT * FROM products WHERE code = '123'; -- L'indice può essere utilizzato SELECT * FROM products WHERE code = 123; -- L'indice NON è utilizzato, possibile full scan
Storia
VARCHAR per supportare diversi formati di valuta. Dopo un paio d'anni è stato necessario ordinare i prodotti per prezzo: le ordinazioni non funzionavano correttamente e l'indicizzazione era impossibile. È stata necessaria una complessa migrazione e conversione dei tipi, che ha richiesto settimane.Storia
FLOAT per memorizzare le somme. Durante i report sono emerse discrepanze a causa degli arrotondamenti, dopo un anno ciò ha portato a errori significativi nella distribuzione dei bonus.Storia
Nei log di una startup, la data e l'ora erano registrate come testo (VARCHAR). Quando è stato necessario calcolare gli intervalli, si è scoperto che il tempo era ovunque in formati diversi, e i calcoli richiedevano un costoso parsing normalizzante, il che ha avuto un impatto negativo sulle prestazioni.