Il casting, detto anche "conversione dei tipi di dato" o "coercizione" (coercion), è una procedura che consente il passaggio di un'informazione o di un valore, espresso per esempio sotto forma di variabile, da un tipo di dato ad un altro; come è noto una tabella in un database viene strutturata sulla base di campi a cui vengono associati tipi di dato definiti dall'utilizzatore attraverso il DBMS (caratteri, numeri interi, decimali, date etc.), in alcuni casi può essere però necessario che un'informazione contenuta all'interno di una tabella appartenga ad un determinato tipo di dato ma debba essere manipolata da un'applicazione come appartenente ad un altro tipo; la cifra "10" può per esempio essere salvata sotto forma di carattere, ma può essere utile anche per effettuare dei calcoli, per far questo è necessaria un'operazione di conversione detta appunto casting.
In questa breve trattazione verranno descritte le caratteristiche degli operatori e delle funzioni di MySQL per la conversione dei tipi di dato.
Funzioni e operatori per il casting di MySQL
MySQL è in grado di compiere la maggior parte delle operazioni di casting in modo completamente automatico quando se ne presenta la necessità, ciò accadrà, per esempio, passando un numero quale parametro ad una funzione che richiede come argomento una stringa; in tutti gli altri casi sarà possibile utilizzare le funzioni e gli operatori per il casting.
Il Database manager MySQL mette a disposizione appena due funzioni per la conversione dei tipi di dato:
- CAST(): consente la conversione del tipo di un valore in un altro tipo;
- CONVERT(): esegue una funzione omologa a quella di CAST() e può essere utilizzata in modo generale per il confronto tra stringhe appartenenti a differenti set di caratteri.
Vi è poi da sottolineare l'utilità dell'operatore BINARY che effettua il casting di una stringa in una stringa binaria; questo operatore rappresenta uno strumento utile per effettuare confronti byte per byte, quindi non carattere per carattere, tra i dati contenuti in colonne diverse; in questo caso infatti saranno considerate sempre significative la differenze fra le maiuscole e le minuscole (confronto case-sensitive) e la presenza di spazi alle fine delle stringhe.
A proposito di quanto esposto si analizzi il seguente esempio:
mysql> SELECT 'html.it' = 'HTML.IT'; -> 1
L'interrogazione restituirà "1" in quanto il confronto risulterà positivo, le due stringhe verranno infatti considerate come uguali in quanto verrà ignorata la differenza tra maiuscole e minuscole; l'output prodotto dalla SELECT
sarà invece diverso nel caso in cui venga introdotto l'operatore BINARY
:
mysql> SELECT BINARY 'html.it' = 'HTML.IT'; -> 0
La seconda interrogazione proposta restituirà "0" perché il confronto operato attraverso BINARY
permetterà di rendere significativa la differenza tra maiuscole e minuscole presente tra le due stringhe confrontate.
Un discorso non diverso vale anche nel caso in cui alla fine di una stringa siano presenti degli spazi vuoti, a questo proposito si analizzino i risultati differenti prodotti dalle due SELECT
proposte di seguito:
mysql> SELECT 'html.it' = 'html.it '; -> 1
mysql> SELECT BINARY 'html.it' = 'html.it '; -> 0
La presenza dell'operatore BINARY permette nel secondo caso proposto di considerare come significativa la presenza dello spazio finale, riconoscendo in questo modo una differenza tra le stringhe utilizzate in query.
Utilizzo delle funzioni CAST()
e CONVERT()
Come anticipato in precedenza, le funzioni CAST()
e CONVERT()
di MySQL svolgono in linea generale lo stesso compito; CAST()
è però una funzione di tipo ANSI()
mentre CONVERT()
è di tipo ODBC, inoltre, le due funzioni presentano una sintassi differente:
CAST(espressione AS tipo di dato) CONVERT(espressione, tipo di dato)
I tipi di dato utilizzabili per le funzioni di casting sono i seguenti:
- BINARY (n)
- CHAR (n)
- DATE
- DATETIME
- TIME
- DECIMAL (solo a partire dalla versione 5.0.17 di MySQL)
- SIGNED (INTEGER)
- UNSIGNED (INTEGER)
Nel caso dei tipi di dato BINARY
e CHAR
sarà possibile specificare anche la lunghezza desiderata per la stringa binaria prodotta dalla procedura di conversione, specificando un valore "n" come parametro numerico all'operatore BINARY
, l'argomento dell'interrogazione verrà quindi convertito in una stringa binaria lunga "n" byte; per cui, ad esempio, l'istruzione seguente:
SELECT CAST(argomento AS BINARY(7));
Porterà alla conversione dell'argomento in una stringa binaria lunga sette byte.
La funzione CONVERT()
, utilizzata generalmente in procedure di confronto tra stringhe rappresentate da diversi set di caratteri, viene utilizzata anche in associazione all'operatore USING
per operare conversioni di dati tra set di caratteri differenti; si analizzi il seguente esempio:
SELECT CONVERT('html.it' USING utf8);
L'istruzione proposta non fa altro che convertire la stringa di caratteri "html.it" dal set di caratteri predefinito per la tabella nella stringa corrispondente espressa nel set di caratteri UTF8.
Come è noto, le stringhe binarie non sono associate ad uno specifico set di caratteri, è il caso per esempio dei tipi di dato BLOB molto utilizzati per il salvataggio in MySQL di informazioni complesse e di grandi dimensioni come per esempio file di immagine, nasce quindi il problema di non poter effettuare confronti case-insensitive tra valori binari; la funzione CONVERT()
può essere utile anche in questo caso per operare conversioni in stringhe non binarie, a questo scopo la funzione verrà utilizzata in associazione con LIKE
, notoriamente case-insensitive:
SELECT 'valore' LIKE CONVERT(campo_blob USING latin1) FROM nome_tabella;
Per essere certi di utilizzare una collation case-insensitive, sarà inoltre necessario utilizzare la clausola COLLATE
di seguito alla chiamata della funzione per il casting.
Gli operatori per la conversione dei tipi di dato possono essere utilizzati anche nel momento in cui si desidera creare una tabella e attribuire un valore specifico relativamente ad un determinato campo, come nell'esempio seguente:
CREATE TABLE nome_tabella SELECT CAST('2000-01-01' AS DATE);
Casting di valori numerici
Come sottolineato in precedenza, in molti casi MySQL è in grado di operare automaticamente il casting quando si presenta la necessità di una conversione, è il caso in cui si desidera per esempio sommare un valore numerico ad una cifra memorizzata sotto forma di stringa:
mysql> SELECT 2+'2'; -> 4
Nel caso in cui si desideri eseguire invece l'operazione contraria, cioè inserire un valore numerico all'interno di un contesto riconosciuto come stringa, sarà necessario operare una semplice concatenazione tramite il costrutto SELECT CONCAT
a cui passare come argomenti i due valori da unire, anche in questo caso la conversione del tipo di dato avverrà in modo automatico:
mysql> SELECT CONCAT('Sei la numero ',1); -> 'Sei la numero 1'
Il Database manager supporta operazioni aritmetiche basate sia su valori SIGNED
(accetta valori negativi) e UNSIGNED
(non li accetta) a 64-bit producendo risultati UNSIGNED
in istruzioni che prevedono gli operatori di addizione e sottrazione tra operandi di cui almeno uno sia un UNSIGNED INTEGER
; ma SIGNED
e UNSIGNED
sono anche degli operatori per il casting con cui sarà possibile evitare l'assegnazione di valori negativi:
mysql> SELECT CAST(2-3 AS UNSIGNED) -> 18446744073709551615
così come permetterli:
mysql> SELECT CAST(CAST(9-11 AS UNSIGNED) AS SIGNED); -> -2
Si noti come nel secondo caso avvenga una doppia operazione di conversione del tipo di dato: il risultato della sottrazione tra i due operandi interi viene prima convertito come tipo che non accetta valori negativi, per poi subire un'ulteriore procedura di casting con cui il risultato diventa SIGNED
.
Nel caso in cui l'uno o l'altro degli operandi sia un numero in virgola mobile, anche il risultato sarà un numero in virgola mobile, mentre un valore stringa utilizzato in un'operazione aritmetica verrà convertito automaticamente nel corrispondente numero in virgola mobile.
Conclusioni
Nonostante il Database manager MySQL sia in grado di svolgere automaticamente la maggior parte delle operazioni necessarie per la conversione dei tipi di dato, per questo DBMS è comunque disponibile un limitato numero di operatori e di funzioni destinate al casting dei valori.
Nel corso di questa trattazione sono stati elencati gli operatori e le funzioni forniti per le istruzioni di conversione, ne sono state sottolineate le caratteristiche e ne sono state proposte le diverse sintassi e le modalità d'uso.
Per approfondimenti è possibile consultare la sezione appositamente dedicata a questi costrutti nel manuale ufficiale di MySQL.