«

»

Nov 05

Encoding e Collation in MySQL

Mi sono imbattuto in un problema bloccante di un sito web: la non coerente adozione di uno stesso encoding in tutti i “pezzi” dell’applicazione web provoca errori bloccanti.

In sostanza ci sono in MySQL due caratteristiche:

  1. l’encoding (codifica) che è la mappatura tra il simbolo (ad esempio “è”) ed il codice esadecimale che lo rappresenta in un file, in un pacchetto TCP/IP, in un database.
  2. la collation (confronto) che consiste in una serie di regole secondo le quali le stringhe vengono confrontate.

Traggo queste informazioni dal sito della MySQL AB.

Collation binaria

Supponiamo di avere questo alfabeto A={‘a’,’b’,’A’,’B’}.

L’encoding (la codifica) è l’insieme c={0, 1, 2, 3}.

IL charset è la mappa c -> A che si può esprimere nella tabella

Simbolo Codice
a 0
b 1
A 2
B 3

La collation è una regola che ci consente di confrontare le stringhe. Confrontare le stringhe sembra semplice, ma ha le sue difficoltà. A partire da una regola lessocigrafica ‘a’ < ‘b’ (a precede b), possiamo utilizzare i codici (visto che hanno la mappa conserva l’ordinamento) per stabilirlo (0 < 1 quindi ‘a’ < ‘b’). Questa si dice collation binaria. Funziona anche se confrontiamo ‘A’ e ‘B’ (infatti questo lo possiamo dedurre dal momento che 2<3).

Ma, secondo questa regola di confronto, ‘b’ < ‘A’!

Dobbiamo adottare una regola più complessa, ad esempio la collation di tipo case-insensitive.

Secondo questa regola dobbiamo prima calcolare c mod 2 per ogni carattere e poi confrontare i codici risultanti, quindi stabiliamo che ‘A’ < ‘b’ (e non il contrario come suggerirebbe il confronto binario).

La cosa si complica se utilizziamo caratteri ‘è’, ‘à’… anzi… ogni lingua ha le sue regole di precedenza. Quindi se al DB chiediamo di fare confronti di stringhe è necessario impostare l’algoritmo giusto per quella lingua.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>