Pensez-y:
- Vous stockez des données dans la base de données en tant que
latin1
- Vos données sont traitées en interne par mysqld
latin1
Si les données provenant du système d'exploitation ou de la connexion le sont utf8
, comment mysqld va-t-il les traiter?
Plutôt que de deviner ou d'espérer le meilleur, vous pouvez changer le comportement du jeu de caractères entrant. À l'exception de information_schema
et mysql
, prenez toutes vos bases de données et définissez le jeu de caractères par défaut sur utf8
:
ALTER DATABASE dbname CHARACTER SET utf8;
Si vous avez une colllation spécifique pour l'accompagner, procédez comme suit:
ALTER DATABASE dbname COLLATE 'utf8_general_ci';
Voici les classements à choisir:
mysql> select * from information_schema.collations where CHARACTER_SET_NAME = 'utf8';
+--------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci | utf8 | 33 | Yes | Yes | 1 |
| utf8_bin | utf8 | 83 | | Yes | 1 |
| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |
| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |
| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |
| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |
| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |
| utf8_polish_ci | utf8 | 197 | | Yes | 8 |
| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |
| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |
| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |
| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |
| utf8_czech_ci | utf8 | 202 | | Yes | 8 |
| utf8_danish_ci | utf8 | 203 | | Yes | 8 |
| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |
| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |
| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |
| utf8_roman_ci | utf8 | 207 | | Yes | 8 |
| utf8_persian_ci | utf8 | 208 | | Yes | 8 |
| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |
| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |
| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |
+--------------------+--------------------+-----+------------+-------------+---------+
22 rows in set (0.03 sec)
Vous pouvez également exécuter
mysql> show collation where charset='utf8';
+--------------------+---------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------+---------+-----+---------+----------+---------+
| utf8_general_ci | utf8 | 33 | Yes | Yes | 1 |
| utf8_bin | utf8 | 83 | | Yes | 1 |
| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |
| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |
| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |
| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |
| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |
| utf8_polish_ci | utf8 | 197 | | Yes | 8 |
| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |
| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |
| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |
| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |
| utf8_czech_ci | utf8 | 202 | | Yes | 8 |
| utf8_danish_ci | utf8 | 203 | | Yes | 8 |
| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |
| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |
| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |
| utf8_roman_ci | utf8 | 207 | | Yes | 8 |
| utf8_persian_ci | utf8 | 208 | | Yes | 8 |
| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |
| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |
| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |
+--------------------+---------+-----+---------+----------+---------+
22 rows in set (0.00 sec)
mysql>
Pour voir le jeu de caractères individuel d'une base de données, exécutez ceci:
mysql> show create database sample;
+----------+-------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------+
| sample | CREATE DATABASE `sample` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
Quant aux paramètres, vous pouvez essayer ceci:
Ajoutez les lignes à my.cnf
[mysqld]
character_set_database=utf8
character_set_server=utf8
puis redémarrez mysql
J'en ai discuté le 01 août 2011: Encodage du jeu de caractères dans une table
CAVEAT (pour les serveurs de base de données MySQL sous Windows)
Ces commandes
ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';
ne fonctionnent pas dans la version Windows de MySQL en raison de la façon dont Windows verrouille les fichiers. Le fichier nécessaire est appelé db.opt
et se trouve dans le sous-dossier de la base de données dans datadir
.
Vous devrez peut-être effectuer les opérations suivantes:
- mysqldump cette base de données (aucune base de données ne crée d'informations, juste la création de tables et INSERTs)
- supprimer cette base de données
- créer une base de données avec le jeu de caractères et le classement spécifiques
- recharger dans la décharge dedans
ÉPILOGUE
Peu importe ce que vous faites, veuillez apporter des modifications sur un serveur de développement / de transfert pour voir si vous obtenez les effets souhaités
MISE À JOUR 2012-12-05 11:00 EDT
Vos questions
Dois-je vraiment le changer?
Pour garantir le traitement approprié des données, vous voudrez peut-être vous assurer que vous avez des pommes à pommes. Les données préparées sous la forme d'un jeu de caractères et le chargement dans une table avec la base de données, alignant éventuellement les données comme s'il voyait un autre jeu de caractères, n'afficheraient probablement pas les données avec le jeu de caractères que mysqld voit lorsqu'elles sont récupérées et renvoyées à une connexion DB. Essayez de charger la base de données sur un serveur de développement / transit et essayez de définir des jeux de caractères par défaut.
Pourquoi certaines valeurs par défaut sont utilisées, utf8
mais certaines sont utilisées par défaut latin1
?
Cela dépend de la version du système d'exploitation du binaire MySQL. Les versions Windows peuvent avoir latin1
alors que les versions Linux peuvent utiliser utf8
.
latin1
etutf8
, par exemple,character_set_connection
est utf8 maischaracter_set_database
est latin1[mysqld] character_set_database=utf8 character_set_server=utf8
ne fonctionne pas.latin1
et doit le convertir pour le stockage?