web-dev-qa-db-fra.com

Pourquoi le serveur de caractères par défaut est latin1?

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?

12
Yoga

Pensez-y:

  • Vous stockez des données dans la base de données sous la forme latin1
  • Vos données sont traitées en interne par mysqld comme 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

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 qui 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 (pas de création d'informations de base de données, 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 utilisent utf8 mais une utilisation par défaut latin1?

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.

8
RolandoMySQLDBA