Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 11 di 58
  • livello intermedio
Indice lezioni

Il CharSet

I charset sono i diversi sistemi attraverso i quali i caratteri sono gestiti su MySQL. Ecco come.
I charset sono i diversi sistemi attraverso i quali i caratteri sono gestiti su MySQL. Ecco come.
Link copiato negli appunti

I 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 collation latin1_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 con bin 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_client, character_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.

Infine va ricordato che le proprietà di un database, relative a charset e collation, definite in fase di creazione, possono essere modificate successivamente, utilizzando il seguente comando:

ALTER DATABASE nome_db
[CHARACTER SET charset] [COLLATE collation]

Ti consigliamo anche