UTF8 MySQL problèmes sur les Rails - les problèmes d'encodage en utf8_general_ci
J'ai une mise en scène Rails site qui est en cours d'exécution sur MySQL 5.0.32-Debian.
Sur ce site, toutes mes tables sont en utilisant utf8 /utf8_general_ci
encodage.
À l'intérieur de cette base de données, j'ai des données qui ressemble à ceci:
mysql> select * from currency_types limit 1,10;
+------+-----------------+---------+
| code | name | symbol |
+------+-----------------+---------+
| CAD | Canadian Dollar | $ |
| CNY | Chinese Yuan | å…ƒ |
| EUR | Euro | € |
| GBP | Pound | £ |
| INR | Indian Rupees | ₨ |
| JPY | Yen | ¥ |
| MXN | Mexican Peso | $ |
| USD | US Dollar | $ |
| PHP | Philippine Peso | ₱ |
| DKK | Denmark Kroner | kr |
+------+-----------------+---------+
Voici la question que je vais avoir
Sur la mise en scène (avec la db et les Rails site en cours d'exécution sur le système debian), les caractères de symboles apparaissent correctement lors de l'affichage de Rails. Par exemple, le Yuan Chinois apparaît comme 元 dans mon navigateur, pas å...ƒ car il montre à l'intérieur de la base de données.
Quand je télécharger ces données vers mon local OS X machine de développement et exécuter la db et les Rails en local, je vois la représentation de l'intérieur de la DB (å...ƒ) sur mon navigateur, pas le personnage 元 que je vois dans la mise en scène.
De débogage j'ai fait
J'ai assuré tous les en-têtes Content-Type sont de retour comme de l'utf-8 à partir de chaque serveur (local, la mise en scène).
Mon serveur mysql local et le serveur de transit sont à la fois le programme d'installation pour l'utilisation de l'utf-8 comme le jeu de caractères par défaut. Je suis à l'aide de "set names 'utf8'" avant de me faire des appels.
Je peux même me connecter à ma base de données intermédiaire de mes OS X Rails de l'hôte, et je vois encore les personnages å...ƒ représentant le yuan. Je devine alors, peut-être il ya un problème avec mon mysql client local, mais je ne peux pas comprendre ce qu'est la question.
Peut-être cela peut donner un indice
Pour le rendre encore plus confus, si je colle le caractère 元 dans la db sur ma machine locale, je vois que dans le navigateur web de l'amende. --- POURTANT, si je colle le même personnage dans ma mise en scène db, je en obtenir un ? marque à sa place sur la page de ma mise en scène Rails site.
Aussi, localement sur mes OS X rails de la machine si j'utilise "set names 'latin1'" avant mes requêtes, tous les caractères de revenir correctement. J'ai eu ces tables comme latin1 avant - serait-ce la question?
Quelqu'un s'il vous plaît aidez-moi ici, je vais fou à essayer de comprendre ce qui est mal!
Vous devez vous connecter pour publier un commentaire.
AHA! Semble que j'ai eu quelques informations de la table de encodé en latin1 avant, et bêtement changé les bases de données en utf8 sans conversion.
L'exécution de la suite d'une correction currency_types table:
Maintenant, j'ai juste veiller à ce que les autres contenus générés après le codage latin1 > utf8 commutateur n'est pas gâché par qui 🙁
Avez-vous de ces deux lignes dans votre
database.yml
sous la bonne section?utf8_unicode_ci
est recommandéutf8_general_ci
est un peu plus rapide, mais il n'est pas aussi précis. La meilleure pratique consiste à utiliserutf8_unicode_ci
. Lire la suite ici: stackoverflow.com/questions/766809/...Vous devriez avoir "encoding: utf-8" dans "config/database.yml" pour la base de données MySQL.
Vous devriez avoir "$KCODE = " u "" dans "config/environment.rb" pour le rubis de l'environnement.
Une autre approche simple consiste à définir le type d'encodage en utilisant
SQL
instruction Alter. Vous pouvez faire cela en utilisant la ci-dessous script bash.embellie
Ma DB est déjà configurée par défaut en utf8, mais j'ai rencontré le même problème.
Aussi après adjonction d'habitude balise meta, le problème est toujours là:
Puis j'ai créé un dédié
connection.php
pour assurer toutes les communications avec MySQL est un ensemble de jeu de caractères utf8. Notez qu'il n'y a pas de-
en utf8 dansmysqli_set_charset($bd, 'utf8')
!Voici mon
Connection.php
:Un autre fichier php:
Pour les Rails exécuter l'extrait de code suivant dans la console rails. Il va générer un sql pour toutes les tables. Ensuite vous connecter à mysql et exécuter copié sql à partir de rails de la console. Il change toutes les tables de codage.
Vous pouvez générer une migration, les Rails de chemin, de modifier le classement de type à vos bases de données:
Vous pouvez ensuite modifier le fichier généré et coller:
Et exécuter la migration:
Vous pouvez également appliquer le nouveau classement sur votre base de données.yml:
Pour plus d'informations sur les Rails de migrations:
http://edgeguides.rubyonrails.org/active_record_migrations.html
Pour plus d'informations sur les types de tri:
http://collation-charts.org/