Jeśli, używając bazę danych MySQL, spotkaliście się kiedyś z błędem typu Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation '=', to mogę się założyć, że za pierwszym razem poświęciliście kilka godzin na to, żeby znaleźć w czym tkwi problem. Porównywanie napisów w MySQL-u jest strasznie wkurzające i uwierzcie mi, lepiej o nim wiedzieć od początku.

Ustawienia sposobu porównywania napisów (ang. collaction) w MySQL-u występują na wielu poziomach. MySQL pozwala na ustawianie porównywania napisów począwszy od serwera bazodanowego, poprzez pojedyncze bazy danych, następnie poprzez tabele, a kończąc na kolumnach. Ustawienia są dziedziczone w wymienionej kolejności. Kiedy nie określimy jakie collation powinna mieć nasza baza danych, to MySQL skopiuje nam ustawienie z serwera. Kiedy nie określimy sposobu porównywania napisów na tabeli, to ustawienie to zostanie skopiowane z bazy danych, do której należy ta tabela. I tak dalej. Dodatkowym miejscem, w którym również jest ustawiane collation jest połączenie nawiązywane przez klienta. Z grubsza rzecz biorąc jest one zależne od ustawień środowiska z jakiego klient nawiązuje połączenie. Nieprawidłowe ustawienia w dowolnym z tych miejsc mogą powodować wyżej wymieniony błąd. Warto więc mieć „ściągę”, która pomoże sprawdzić sposób porównywania napisów na dowolnym poziomie. Poniżej prezentuję kilka zapytań, które powinny w tym pomóc.

Serwer bazy danych
show variables like 'collation_server';
Baza danych
show variables like 'collation_database';
Tabela
select table_collation from information_schema.tables
  where table_schema = 'TableSchema'
    and table_name   = 'TableName';
Kolumna
select collation_name from information_schema.columns 
  where table_schema = 'TableSchema' 
    and table_name   = 'TableName' 
    and column_name  = 'ColumnName';
Połączenie
show variables like 'collation_connection';

Z takim zestawem zapytań na pewno o wiele prościej będzie Wam namierzyć gdzie leży problem.

Więcej informacji o porównywaniu napisów i tematach pokrewnych można znaleźć w dokumentacji MySQL-a.