J’ai quelque fois ce problème dans mon application et je souhaitais
avoir votre avis dessus …
ActiveRecord::StatementInvalid: Mysql::Error: Illegal mix of
collations (latin1_swedish_ci,IMPLICIT) and
(utf8_general_ci,COERCIBLE) for operation ‘=’: SELECT * FROM items
WHERE (items.title = ‘Station Karlovy lázn?’ AND items.lat =
50.085249 AN…
Existe-t-il des parades pour ce genre de problèmes ?
Mon database.yml précise l’encodage en utf8.
Existe-t-il des parades pour ce genre de problèmes ?
Mon database.yml précise l’encodage en utf8.
Mais ta base est-elle vraiment en UTF-8 car justement ca laisserai
penser l’inverse. comme du latin1_sweedish qui est un des encodage par
défaut avec PHPMyAdmin je crois
Oui, tout dépend des réglages par défaut de ton MySQL. Généralement
c’est latin1_swedish_ci, ce qui pourrait expliquer ton problème.
Tu peux voir la collation d’une table avec cette requête :
show full columns from
;
Normallement, ça devrait être en UTF8
Pour régler le problème, tu peux créer ta DB avec la tache rake qui va
bien (rake db:create), elle mettra la bonne collation.
Pour info, si dans le database.yml tu spécifies que la DB “est” en UTF8,
cela veut juste dire que le charset de la connexion sera en UTF8, et que
les nouvelles tables/bases créées par rails le seront.
Mais, la base peut être dans un encodage différent ? En fonction de la
configuration de mysql sur le serveur ?
Tout à fait. L’UTF-8 n’est pas par défaut sur les Base de donnée. Par
exemple il faut créer la base de donnée PostgreSQL avec l’option -E
UNICODE :
createdb -E UNICODE ‘yahoo’
Je ne connais pas mysql donc je ne sais pas comment changer l’encodage
et même si c’est possible. Ensuite pour créer tes BDD tu aurais pu
utiliser la tâche rake :
rake db:create
qui aurait peut-être créé en UTF-8. Je ne sais pas.
Le fichier database.yml ne fait que dire que la BDD est en UTF-8. Cela
ne certifie pas que ca soit le cas vu que c’est externe à Rails. Ca
envoi juste les DATA en UTF-8.
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER DATABASE DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
Il est possible qu’il fasse modifier aussi au niveau des champs, je ne
suis plus sur.
Pour l’UTF-8, c’est un encodage de caractères qui permet de représenter
a peu près tous les caractères qui existent, y compris le Japonais, le
Chinois, et tous les autres alphabets.
Si tu veux faire une application internationalle (et dans les autres cas
aussi d’ailleurs), il vaut mieux choisir cet encodage dès le début, afin
de ne pas avoir à se retrouver à faire des conversions dans tous les sens.
Tu peux avoir plus d’informations sur l’UTF-8 ici :