I set di caratteri (charset o character set), detti anche gruppi codificati di caratteri, sono dei sistemi attraverso i quali i numeri, le lettere di un alfabeto (grafemi), i segni di interpunzione, i simboli e i caratteri speciali riproducibili digitalmente vengono archiviati in un formato binario. Nel corso di questa breve trattazione verrà affrontato il tema relativo alla gestione dei set di caratteri tramite il DBMS MySQL.
Gestione del set di caratteri predefinito e delle collations
Il set di caratteri predefinito per il Database server MySQL è il latin1
, ad esso è associata e la collation latin1_swedish_ci
che permette di lavorare anche con le regole dei caratteri utilizzati nei paesi scandinavi; infatti, ad ogni set di caratteri vengono associate una o più collations (termine traducibile come raccolta
o anche collazione
che introduce il significato di confronto
), esse rappresentano le modalità disponibili per confrontare le stringhe di caratteri appartenenti ad un determinato set. L'utilizzo di latin1 e di latin1_swedish_ci mette a disposizione gli strumenti necessari per soddisfare le esigenze di compatibilità con i caratteri più utilizzati negli Stati Uniti e nei paesi dell'Europa Occidentale.
Uno specifico set definisce l'insieme dei caratteri accettabili e identificabili durante le operazioni di estrazione e manipolazione dei dati, le collations indicano invece come le stringhe dovranno essere estratte all'interno di comandi SELECT
lanciati da istruzioni contenenti le clausole ORDER BY
e GROUP BY
.
Naturalmente, MySQL consente di modificare il set di caratteri predefinito e le relative collations con due apposite opzioni che sono --character-set-server
e --collation-server
da utilizzare all'avvio dell'applicazione; l'unico vincolo è quello di indicare una collation compatibile con il set di caratteri che si intende utilizzare, per questo scopo, sarà possibile lanciare il comando SHOW COLLATION che permetterà di reperire le informazioni necessarie al fine di stabilire quali collations sono disponibili per un determinato charset.
Per quanto riguarda i set di caratteri disponibili, questi dipendono dalle direttive configurabili attraverso le opzioni --with-charset=nome_charset
e --with-extra-charsets
, mentre i file per la configurazione dei charset sono presenti sul percorso SHAREDIR/charsets/Index
.
Nel momento in cui un client stabilisce una connessione con il database server, quest'ultimo specificherà al richiedente il tipo di set di caratteri predefinito corrente, quindi il client utilizzerà quel charset come set di caratteri di riferimento per l'intera durata della connessione.
Può verificarsi il caso in cui un client sia stato compilato definendo percorsi diversi da quelli utilizzati dal server e che i set di caratteri non siano stati tutti inclusi tra i binari di MySQL; in presenza di una situazione come quella descritta, se per il server è stato predefinito un set di caratteri diverso da quello del client, sarà necessario che l'utilizzatore indichi il percorso in cui sono presenti i charset richiesti per poter interrogare il server.
Questo sarà possibile utilizzando l'opzione --character-sets-dir
a cui dovrà essere passato quale argomento il percorso al charset, come nell'esempio seguente:
character-sets-dir=/usr/local/mysql/share/mysql/charsets
Se non si dispone dell'informazione necessaria per valorizzare il parametro richiesto dall'opzione, è comunque possibile obbligare il client ad utilizzare un determinato set di caratteri grazie all'opzione default-character-set
a cui va passato come argomento il nome del charset da utilizzare.
Per l'escaping delle stringhe all'interno della interrogazioni in linguaggio SQL, cioè per effettuare il quoting (delimitazione) dei caratteri, è possibile utilizzare mysql_escape_string()
, inoltre, è disponibile la più recente funzione mysql_real_escape_string()
che vincola l'account al set di caratteri utilizzato per una specifica connessione.
Gestione dei set di caratteri nelle istruzione SQL
Ad ogni database creato da MySQL è associato un set di caratteri e una collation che non possono essere nulli, le istruzioni CREATE DATABASE
e ALTER DATABASE
mettono a disposizione delle clausole (opzionali negli altri casi) con cui sarà possibile specificare il charset e la collation di riferimento per un determinato database; la sintassi da utilizzare per questo tipo di operazioni dovrà essere la seguente:
CREATE DATABASE nome_database [[DEFAULT] CHARACTER SET nome_charset] [[DEFAULT] COLLATE nome_collation] ALTER DATABASE nome_database [[DEFAULT] CHARACTER SET nome_charset] [[DEFAULT] COLLATE nome_collation]
Di seguito viene proposto un esempio pratico di creazione di database con definizione di set di caratteri e relativa collation:
CREATE DATABASE agenda DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
Il Database server MySQL sceglierà il set di caratteri e la collation da utilizzare per un database sulla base delle seguenti regole:
- Se essi sono stati specificati in sede di creazione del database verranno utilizzati quelli definiti dall'utilizzatore
- Se viene specificato il set, ma non la collation, allora verrà utilizzata la collation predefinita per il set di caratteri scelto al momento della creazione del database
- Se nessuno dei due viene specificato MySQL utilizzerà il charset e la collation predefinita per il Database server
La sintassi utilizzata per le istruzioni SQL CREATE DATABASE .. DEFAULT CHARACTER SET ..
è analoga a quella utilizzata per le istruzioni SQL standard CREATE SCHEMA .. CHARACTER SET ..
; per questo motivo è possibile creare basi di dati con differenti set di caratteri e diverse collations attraverso un medesimo server MySQL.
Il set di caratteri e la collation di uno specifico database vengono utilizzati come valori predefiniti anche per le tabelle interne ad esso, a meno che non venga specificato diversamente nel corso di un'istruzione basata sul comando CREATE TABLE.
Il set di caratteri e la collation scelti dall'utilizzatore per un determinato database rimangono disponibili per la sessione corrente come valori associati alle variabili di sistema del Database server denominate character_set_database
e collation_database
; MySQL reimposterà queste variabili ogni volta che sarà selezionata una nuova base di dati da interrogare, ma nel caso in cui non sia stata ancora effettuata una chiamata ad un database, esse acquisiranno un valore corrispondente a quello delle variabili character_set_server
e collation_server
in vigore per il Database server utilizzato.
Anche per le tabelle il charset e la collation non possono essere nulli, le istruzioni CREATE TABLE
e ALTER TABLE
prevedono clausole opzionali per la loro definizione:
CREATE TABLE nome_tabella (nome_campi) [DEFAULT CHARACTER SET nome_charset [COLLATE nome_collation]] ALTER TABLE nome_tabella [DEFAULT CHARACTER SET nome_charset] [COLLATE nome_collation] Un esempio pratico del loro utilizzo potrebbe essere il seguente: CREATE TABLE recapiti (nomi) DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
Le regole seguite da MySQL per la scelta di charset è collation di tabelle sono le seguenti:
- Se entrambi sono stati definiti verranno utilizzati set di caratteri e collation specificati dall'utilizzatore
- Se è stato definito solo il charset allora verrà utilizzata la collation di default per quel set di caratteri
- Se entrambi non sono stati specificati verranno utilizzati quelli predefiniti per il database di appartenenza
Il rapporto tra campi e set di caratteri si limita naturalmente al discorso riguardante le colonne destinate a contenere questi ultimi e cioè quelle per cui sono stati specificati i tipi di dato CHAR
, VARCHAR
o TEXT
, per esse charset e collation non possono essere nulli. Anche in questo caso è disponibile un'apposita sintassi che fornisce due clausole opzionali:
nome_campo {CHAR | VARCHAR | TEXT} (lunghezza_campo) [CHARACTER SET nome_charset [COLLATE nome_collation]]
CHARACTER SET
e COLLATE
sono delle clausole standard per MySQL e il loro utilizzo pratico è riassunto dal seguente esempio:
CREATE TABLE recapiti ( nomi VARCHAR(30) CHARACTER SET latin1 COLLATE latin1_swedish_ci );
Il Database server sceglierà il set di caratteri e la collation di riferimento per i campi sulla base delle seguenti regole:
- Se sono stati specificati verranno impiegati set di caratteri e collation definiti in sede di creazione dei campi
- Se è stato specificato soltanto il charset verrà scelta la collation predefinita per il set di caratteri previsto
- Se charset e collation non sono stati specificati, verranno utilizzati quelli predefiniti per la tabella di riferimento