Mysql: Illegal mix of collations
Un errore che può capitare, quando si effettuano query su due db o due tabelle con una collations differente, è il seguente:
ERROR 1267 (HY000): Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation ‘=’
Questo errore indica che i due campi su cui stiamo effettuando la query hanno una collations differente e non compatibile. Facciamo qualche esempio ecco la nostra tabella:
show create table a;
CREATE TABLE `a` (
`campo1` varchar(64) character set latin1 collate latin1_bin NOT NULL default ”
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |show create table b;
CREATE TABLE `b` (
`campo2` varchar(255) NOT NULL default ”
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
La tabella b non avendo alcuna collations impostata, prenderà quella di default, ovvero:
collate latin1_general_ci
Ora se andiamo a fare una query che preleva i dati da entrambe le tabelle, otterremo il seguente errore:
SELECT * FROM a,b WHERE campo1 = campo2;
ERROR 1267 (HY000): Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation ‘=’
Ora per risolvere il problema forziamo la collate latin1_bin in latin1_general_ci:
ALTER TABLE a character set latin1 collate latin1_general_ci , modify column campo1 varchar(64) character set latin1 collate latin1_general_ci NOT NULL;
A questo punto lo show create table ci mostrerà la nuova collate impostata per il campo campo1 e la query che prima ci restituiva l’errore ora sarà eseguita correttamente.


