Se vi siete imbattuti in questo articolo è molto probabile che stiate cercando di normalizzare la Collation di uno o più Database, tabelle e/o colonne contenute all'interno di una istanza MySQL per risolvere un problema di illegal mix come il seguente:
Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation ...
Prima di proseguire, è opportuno fare chiarezza sul significato del termine Collation, che spesso viene impropriamente confuso con il Character Set. Il modo migliore per farlo è leggere l'illuminante definizione presente nella documentazione ufficiale MySQL:
A character set is a set of symbols and encodings. A collation is a set of rules for comparing characters in a character set.
Vediamo ora come fare per localizzare in modo veloce ed efficace le colonne aventi una Collation specifica. Il modo più semplice e veloce che ho trovato finora è farlo utilizzando la query che riporto di seguito, proveniente da questa risposta sul sito StackOverflow (un grazie a Dean Rather per averla condivisa):
1 2 3 4 |
SELECT table_schema, table_name, column_name, character_set_name, collation_name FROM information_schema.columns WHERE collation_name = 'latin1_general_ci' ORDER BY table_schema, table_name,ordinal_position; |
E' ovviamente necessario sostituire latin1_general_ci con il nome della Collation e/o del Character Set che si desidera individuare: in alternativa, è anche possibile ragionare al contrario, modificando l'istruzione WHERE in modo da cercare tutte le colonne che hanno una Collation DIVERSA da quella predefinita.
Una volta identificate le colonne - e i relativi Database - è possibile effettuare delle operazioni per modificare la Collation di tutte tabelle (e/o il Character Set di tutte le colonne) seguendo le istruzioni descritte in questo altro articolo.