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()
- CONVERT()
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:
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
BINARY
mysql> SELECT BINARY 'html.it' = 'HTML.IT'; -> 0
La seconda interrogazione proposta restituirà "0" perché il confronto operato attraverso BINARY
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
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()
CONVERT()
Come anticipato in precedenza, le funzioni CAST()
CONVERT()
CAST()
ANSI()
CONVERT()
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
CHAR
BINARY
SELECT CAST(argomento AS BINARY(7));
Porterà alla conversione dell'argomento in una stringa binaria lunga sette byte.
La funzione CONVERT()
USING
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()
LIKE
SELECT 'valore' LIKE CONVERT(campo_blob USING latin1) FROM nome_tabella;
Per essere certi di utilizzare una collation
COLLATE
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:
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:
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
mysql> SELECT CONCAT('Sei la numero ',1); -> 'Sei la numero 1'
Il Database manager supporta operazioni aritmetiche basate sia su valori SIGNED
UNSIGNED
UNSIGNED
UNSIGNED INTEGER
SIGNED
UNSIGNED
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.