J'utilise MySQL 5.5 et quand je montre des variables sur charset, j'ai
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Dois-je changer le character_set_database
et character_set_server
à utf8
?
Pensez-y:
latin1
latin1
Si les données provenant du système d'exploitation ou de la connexion sont utf8
, comment mysqld va-t-il le 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
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
qui se trouve dans le sous-dossier de la base de données dans datadir
.
Vous devrez peut-être effectuer les opérations suivantes:
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
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 utilisent
utf8
mais une utilisation par défautlatin1
?
Cela dépend de la version du système d'exploitation du binaire MySQL. Les versions de Windows peuvent avoir latin1
alors que les versions Linux peuvent utiliser utf8
.