I set di caratteri

character set (insiemi di caratteri) sono i diversi sistemi attraverso i quali i caratteri alfanumerici, i segni di punteggiatura e tutti i simboli visualizzabili su un computer vengono memorizzati in un valore binario.

In ogni set di caratteri, ad un valore binario corrisponde un carattere ben preciso. Di conseguenza, quando una stringa viene memorizzata utilizzando un certo set di caratteri, dovrà essere visualizzata attraverso quello stesso insieme, altrimenti alcuni caratteri potrebbero apparire diversi da come ce li aspettiamo.

L’esempio classico di questo inconveniente si verifica in genere con le lettere accentate e, a volte, con il simbolo dell’Euro, che ogni tanto capita di vedere non rappresentati correttamente, ad esempio su una pagina web: segno che non stiamo visualizzando quella pagina con il giusto insieme di caratteri.

MySQL, a partire dalla versione 4.1, ha introdotto un supporto molto avanzato alla gestione di diversi character set. Infatti ci consente di gestire i set di caratteri a livello di server, database, tabella e singola colonna, nonchè di client e di connessione.

Ad ogni set di caratteri sono associate una o più collation, che rappresentano i modi possibili di confrontare le stringhe di caratteri facenti parte di quel character set. Questo termine potrebbe essere tradotto con l’italiano collazione, al quale lo Zingarelli attribuisce, fra gli altri, il significato di “confronto”, segnalandolo però come non più in uso.

Per fare un esempio quindi potremo dire che una determinata tabella utilizza il character set latin 1 (quello maggiormente usato in Europa Occidentale) e la collationlatin1_general_cs. Tale collation è multilingue (cioè non specifica per una lingua) e “case sensitive” come dimostra il “cs” finale, cioè tiene conto della differenza fra maiuscole e minuscole nell’ordinare o confrontare le stringhe.

In generale possiamo dire che il nome di ogni collation segue un determinato standard: inizia con il nome del character set a cui si riferisce, comprende di solito una specifica relativa ad una lingua, e termina con cs (case sensitive) o ci (case insensitive) a seconda che tenga o meno in considerazione la differenza tra maiuscole e minuscole, oppure conbin quando il valore binario dei caratteri è utilizzato direttamente per i confronti.

Quindi avremo, ad esempio, latin1_swedish_ci per la collation svedese case insensitive di latin1, e latin1_german2_ci per la collation, sempre case insensitive, basata sulle regole tedesche DIN-2, mentre utf8_bin è la collation binaria della codifica utf8 (Unicode). Normalmente l’esistenza di una collation dedicata ad una singola lingua si ha quando le regole generali del set di caratteri non soddisfano le esigenze di quella lingua.

Le collation dedicate al tedesco, ad esempio, servono a trattare nel giusto modo le vocali con dieresi (ad esempio Ü) e la lettera “sharp” (ß).

Le istruzioni SQL “SHOW CHARACTER SET” e “SHOW COLLATION” ci consentono di ottenere la lista, rispettivamente, dei set di caratteri e delle collation disponibili sul server. Dei primi viene mostrata, per ogni insieme, la collation di default. Delle seconde possiamo vedere a quale set di caratteri appartengono: è chiaro infatti, da ciò che abbiamo detto finora, che ogni collation è legata ad un singolo character set.

Come detto, MySQL gestisce character set e collation a diversi livelli: server, database, tabella, colonna. Parlando di dati memorizzati, ovviamente ciò che è rilevante è quale charset viene utilizzato per ogni colonna (di tipo CHAR, VARCHAR o TEXT). Tutti i valori di livello superiore, quindi, hanno il solo scopo di funzionare da default per il rispettivo livello inferiore.

A livello di server abbiamo le variabili default_character_set e default_collation, per le quali valgono le solite regole relative alle variabili di sistema: quindi possono essere inizializzate ad esempio da un file di opzioni, e anche modificate a runtime. In mancanza di inizializzazione il charset di default sarà latin1 con la collation latin1_swedish_ci.

Vediamo ora alcuni esempi di definizioni SQL:

CREATE DATABASE db1 [CHARACTER SET utf8] [COLLATE utf8_general_ci];
CREATE TABLE tabella1 (
        colonna1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german_ci,
        colonna2 VARCHAR(5) CHARACTER SET latin1,
        colonna3 VARCHAR(10)
) [DEFAULT CHARACTER SET latin1 [COLLATE latin1_general_ci]];

Come sempre, le espressioni fra parentesi quadre vanno intese come facoltative.
La prima istruzione crea un database i cui default sono character set utf8 e collation utf8_general_ci.

Non indicare la collation sarebbe stato indifferente, perchè utf8_general_ci è quella di default per utf8. Non indicare utf8 avrebbe significato utilizzare, come default per il database, i valori del server. Teniamo presente che i due valori viaggiano sempre accoppiati, nel senso che non è possibile trasmettere “verso il basso” il default della collation indipendentemente da quello del character set, per il motivo visto prima che ogni collation è legata a un solo set di caratteri. Quindi, ad ogni livello, o si ereditano entrambi i valori dal livello superiore, oppure, una volta stabilito il charset, la collation, se non espressa esplicitamente, sarà il default per quel charset.

Proseguiamo coi nostri esempi: nella seconda istruzione viene creata una tabella con charset di default latin1 e collation latin1_general_ci; vedete quindi come i valori del database siano completamente ignorati per questa tabella. All’interno della tabella abbiamo colonna1, per la quale abbiamo dichiarato entrambi i valori; colonna2 che è dichiarata esplicitamente come charset latin1: non avendo indicato una collation, sarà usata latin1_swedish_ci, che è il default per latin1, e non il default della tabella. Per colonna3 invece non abbiamo indicato niente, per cui valgono i default della tabella.

Occupiamoci ora delle impostazioni altrettanto importanti relative ai client e alle connessioni. Le variabili di sistema character_set_clientcharacter_set_results rappresentano, rispettivamente, il charset delle istruzioni in arrivo dal client e quello che sarà utilizzato per spedire le risposte; abbiamo poi character_set_connection e collation_connection, che sono utilizzate dal server per convertire le istruzioni ricevute fare confronti fra le costanti stringa.

Le più importanti sono le prime due, che devono permettere al client di dialogare correttamente col server: tali impostazioni infatti dovranno riflettere l’effettivo set di caratteri utilizzato dal client. I seguenti comandi si utilizzano per modificare queste impostazioni:

SET NAMES 'x';
SET CHARACTER SET 'x';

dove ‘x’ è un character set.
La prima istruzione imposta a ‘x’ i valori di character_set_client, character_set_results e character_set_connection, mentre collation_connection sarà il default per il relativo charset. Con la seconda invece vengono impostati a ‘x’ i valori di character_set_client e character_set_results, mentre i valori della connessione saranno quelli di default del server.

Se utilizzate il client mysql sul prompt dei comandi di Windows, molto probabilmente avrete difficoltà nella visualizzazione e nell’immissione delle lettere accentate: questo è dovuto al fatto che in genere il Windows prompt utilizza il charset cp850 (per scoprirlo digitate il comando DOS ‘chcp’).

In questo caso quindi dovrete utilizzare l’istruzione SET NAMES cp850 per operare in modo corretto. È tuttavia ovvio che nemmeno l’utilizzo del charset corretto può supplire alla mancanza di certi caratteri nel character set stesso: con il cp850 ad esempio non sarà possibile visualizzare nè inserire il simbolo dell’Euro.

Both comments and pings are currently closed.

Comments are closed.