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


12

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 avoir besoin de changer le character_set_databaseet character_set_serverle utf8?

Réponses:


8

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_schemaet 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.optet 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, utf8mais 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 latin1alors que les versions Linux peuvent utiliser utf8.


Salut, merci pour votre réponse détaillée. En fait, ma question n'est pas de savoir comment le changer, mais ... 1. Dois-je vraiment le changer? 2. Pourquoi certains paramètres par défaut utilisent utf8 mais certains utilisent par défaut latin1
Yoga

1
(merci encore en premier) Cela dépend de la version du système d'exploitation du MySQL Binary. <- Je veux dire quand je suis sur Ubuntu, pourquoi le défaut est mélangé entre latin1et utf8, par exemple, character_set_connectionest utf8 mais character_set_databaseest latin1
Yoga

1
@Rolando [mysqld] character_set_database=utf8 character_set_server=utf8ne fonctionne pas.
Jorge B.

Je ne comprends toujours pas ... même si le système d'exploitation hôte utilise un jeu de caractères limité stupide, la base de données ne devrait-elle pas stocker par défaut du texte dans un jeu de caractères qui peut représenter n'importe quel caractère, même s'il accepte l'entrée latin1et doit le convertir pour le stockage?
Andy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.