Encodage dans mysql

Bonjour,

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.

production:
adapter: mysql
encoding: utf8

Je vous remercie par avance,
Pierre

Pierre V. wrote:

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 :slight_smile:


Cyril M.

Cyril : cela veut-il dire que la base peut-être configurée en autre
chose
que utf8 ?Comment peut-on voir cela ?
La seule chose que j’ai faite depuis le début, c’est

mysql > CREATE DATABASE …

et ensuite, tout a été fait à partir de Rails, avec database.yml qui
précise
encodage: utf8

Mais, la base peut être dans un encodage différent ? En fonction de la
configuration de mysql sur le serveur ?

2009/1/29 Cyril M. [email protected]

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 :slight_smile:

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.

renchap

Pierre V. a écrit :

Merci pour vos réponses.
Mes colonnes mysql sont effectivement en latin1_swedish_ci alors j’ai
tout
crée avec Rails et un encodage utf8.

J’ai entendu dire qu’il fallait mieux avoir de utf8 si on souhaite avoir
une
base de données qui puisse avoir des données de tous les pays. Google
semble
utiliser utf8 pour les appels vers ses API. Est-ce que cela veut-il dire
que
Facebook utilise de l’utf8 pour stocker des caractères dans n’importe
quel
pays du monde ?

Est-ce que tout cela est vrai ?
Est-ce que je peux encore changer l’encodage de ma base pour passer en
utf8
?

Merci !
Pierre

2009/1/29 Renaud C. [email protected]

Pierre V. wrote:

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.


Cyril M.

A priori, tu peux faire :
ALTER TABLE

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 :

renchap

Pierre V. a écrit :

“Mes colonnes mysql sont effectivement en latin1_swedish_ci alors j’ai
tout
crée avec Rails et un encodage utf8.”
Précision : sauf la base de données au départ. Seules les tables ont été
crées avec Rails.

2009/1/29 Pierre V. [email protected]

Merci beaucoup pour tes précisions Renaud.Après avoir néanmoins pas mal
cherché pour trouver une solution qui marche, j’ai trouvé la migration
suivante :

http://pastie.org/374738

qui marche parfaitement

merci, bonne soirée !

2009/1/29 Renaud C. [email protected]