web-dev-qa-db-fra.com

Changer le jeu de caractères par défaut de MySQL en UTF-8 dans my.cnf?

Actuellement, nous utilisons les commandes suivantes dans PHP pour définir le jeu de caractères sur TF-8 dans notre application.

Comme il s’agit là d’une légère surcharge, nous aimerions le définir comme paramètre par défaut dans MySQL. Peut-on faire cela dans /etc/my.cnf ou ailleurs?

SET NAMES 'utf8'
SET CHARACTER SET utf8

J'ai cherché un jeu de caractères par défaut dans /etc/my.cnf, mais il n'y a rien à propos des jeux de caractères.

À ce stade, j'ai procédé comme suit pour définir le jeu de caractères MySQL et les variables de classement sur UTF-8:

skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8

Est-ce une façon correcte de gérer cela?

325
Jorre

Pour définir la valeur par défaut sur UTF-8, vous souhaitez ajouter les éléments suivants à my.cnf.

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

Si vous souhaitez modifier le jeu de caractères d'une base de données existante, faites-le-moi savoir ... votre question ne le spécifiait pas directement, aussi je ne suis pas sûr si c'est ce que vous voulez faire.

409
NinjaCat

Pour la version récente de MySQL,

default-character-set = utf8

cause un problème. C'est obsolète je pense.

Comme Justin Ball dit dans " La mise à niveau vers MySQL 5.5.12 et maintenant MySQL ne démarre pas , vous devez:

  1. Supprimez cette directive et vous devriez être bon.

  2. Ensuite, votre fichier de configuration ('/etc/my.cnf' par exemple) devrait ressembler à ceci:

    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
    
  3. Redémarrez MySQL.

  4. Pour vous assurer que votre MySQL est UTF-8, exécutez les requêtes suivantes dans votre invite MySQL:

    • Première requête:

       mysql> show variables like 'char%';
      

      La sortie devrait ressembler à:

       +--------------------------+---------------------------------+
       | Variable_name            | Value                           |
       +--------------------------+---------------------------------+
       | character_set_client     | utf8                            |
       | character_set_connection | utf8                            |
       | character_set_database   | utf8                            |
       | character_set_filesystem | binary                          |
       | character_set_results    | utf8                            |
       | character_set_server     | utf8                            |
       | character_set_system     | utf8                            |
       | character_sets_dir       | /usr/local/mysql/share/charsets/|
       +--------------------------+---------------------------------+
      
    • Deuxième requête:

       mysql> show variables like 'collation%';
      

      Et le résultat de la requête est:

       +----------------------+-----------------+
       | Variable_name        | Value           |
       +----------------------+-----------------+
       | collation_connection | utf8_general_ci |
       | collation_database   | utf8_unicode_ci |
       | collation_server     | utf8_unicode_ci |
       +----------------------+-----------------+
      
247
Mustafah

Sur MySQL 5.5, j'ai dans my.cnf

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

Le résultat est

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
55
tomazzlender

Mathias Bynens a déjà mentionné que "utf8mb4" devrait être utilisé à la place de "utf8" afin d'obtenir un meilleur support UTF-8 ("utf8" ne supporte pas les caractères à 4 octets, les champs sont tronqué à l'insertion ). Je considère cela comme une différence importante. Voici donc une autre réponse sur la manière de définir le jeu de caractères et le classement par défaut. Celui qui vous permettra d'insérer un tas de caca (????).

Cela fonctionne sur MySQL 5.5.35.

Notez que certains paramètres peuvent être facultatifs. Comme je ne suis pas tout à fait sûr de ne rien oublier, je ferai de cette réponse un wiki de communauté.

Vieux paramètres

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

Config

# ???? ????
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

Nouveaux paramètres

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

character_set_system est toujours utf8 .

Cela n'affectera pas les tables existantes, c'est juste le paramètre par défaut (utilisé pour les nouvelles tables). Le ALTER code suivant peut être utilisé pour convertir une table existante (sans la solution de contournement dump-restore):

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Modifier:

Sur un serveur MySQL 5.0: character_set_client, character_set_connection, character_set_results, collation_connection restent à latin1. Emettre SET NAMES utf8 (utf8mb4 n'est pas disponible dans cette version) les définit également sur utf8.


Mise en garde : Si vous aviez une table utf8 avec une colonne d'index de type VARCHAR (255), elle ne peut pas être convertie dans certains cas, car le maximum la longueur de la clé est dépassée (Specified key was too long; max key length is 767 bytes.). Si possible, réduisez la taille de la colonne de 255 à 191 (car 191 * 4 = 764 <767 <192 * 4 = 768). Après cela, la table peut être convertie.

51
basic6

Remarque: Le fichier my.cnf se trouve à l'adresse /etc/mysql/

Après avoir ajouté ces lignes:

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
skip-character-set-client-handshake

[client]
default-character-set   = utf8

[mysql]
default-character-set   = utf8

N'oubliez pas de redémarrer le serveur:

Sudo service mysql restart
28
М.Б.

NijaCat était proche, mais le dépassement spécifié:

Pour définir la valeur par défaut sur UTF-8, vous souhaitez ajouter les éléments suivants à my.cnf.

[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8

Ensuite, pour vérifier:

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
24
Derek

J'ai aussi découvert qu'après avoir placé default-character-set = utf8 sous [mysqld] titre, MySQL 5.5.x ne commencerait pas sous buntu 12.04 (Precise Pangolin).

23
amiroff

MySQL v5.5.3 et supérieur:

Ajoutez juste trois lignes seulement dans la section [mysqld]:

[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake

Remarque: Inclure skip-character-set-client-handshake élimine ici la nécessité d'inclure à la fois init-connect dans [mysqld] et default-character-set dans le [client] et [mysql] sections.

22
mug896

Sous Xubuntu 12.04, j'ai simplement ajouté

[mysqld]
character_set_server = utf8

vers /etc/mysql/my.cnf

Et le résultat est

mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

Regardez aussi http://dev.mysql.com/doc/refman/5.6/en/charset-server.html

9
Falko

Tous les paramètres énumérés ici sont corrects, mais voici la solution la plus optimale et la plus suffisante:

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

Ajoutez-les à /etc/mysql/my.cnf.

Veuillez noter que je choisis le type de classement utf8_unicode_ci en raison de problèmes de performances.

Le résultat est:

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

Et c'est à ce moment-là que vous vous connectez en tant qu'utilisateur non-SUPER !

Par exemple, la différence entre la connexion en tant qu'utilisateur SUPER et utilisateur non-SUPER (bien sûr en cas de collation utf8_unicode_ci ):

utilisateur avec SUPER priv .:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci | <---
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

utilisateur avec non-SUPER privé:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

J'ai écrit un article complet (Rus) expliquant en détail pourquoi vous devriez utiliser l'une ou l'autre option. Tous les types de jeux de caractères et Des collations sont considérés: pour serveur, pour base de données, pour la connexion, pour la table et même pour la colonne.

J'espère que cela et l'article aideront à clarifier les moments incertains.

9
gahcep

La directive a été changée en character-set-system=utf8

http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html

5
Loren

Sur Fedora 21

$ vi /etc/my.cnf

Ajouter suivre:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

Sauvegarder et quitter.

Rappel final, redémarrez le service mysqld avec service mysqld restart.

Les versions de MySQL et les distributions Linux peuvent avoir de l'importance lors de la configuration.

Toutefois, les modifications de la section [mysqld] sont encouragées.

Je veux donner une brève explication de la réponse de tomazzlender:

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

[mysqld]

Cela va changer collation_connection en utf8_unicode_ci

init_connect='SET collation_connection = utf8_unicode_ci'

Utiliser SET NAMES:

init_connect='SET NAMES utf8'

Les noms définis influenceront trois caractères, à savoir:

character_set_client
character_set_results
character_set_connection

Ceci définira character_set_database & character_set_server

character-set-server=utf8

Cela n'affectera que collation_database & collation_server

collation-server=utf8_unicode_ci

Désolé, je ne suis pas sûr de savoir à quoi ça sert. Je ne l'utilise pas cependant:

skip-character-set-client-handshake
4
Lihang Li

Si vous ne parvenez pas à confirmer la prise en charge du jeu de caractères du client à l'aide de MySQL Workbench, tenez compte des remarques suivantes:

Important Toutes les connexions ouvertes par MySQL Workbench définissent automatiquement le jeu de caractères du client sur utf8. Si vous modifiez manuellement le jeu de caractères du client, par exemple en utilisant SET NAMES ..., MySQL Workbench peut ne pas afficher correctement les caractères. Pour plus d'informations sur les jeux de caractères du client, voir Jeux de caractères de connexion et classements.

Ainsi, je n'ai pas pu remplacer les jeux de caractères de MySQL Workbench par des modifications de my.cnf. par exemple. 'set noms utf8mb4'

1
paiego

MySQL 5.5, tout ce dont vous avez besoin est:

[mysqld]
character_set_client=utf8
character_set_server=utf8
collation_server=utf8_unicode_ci

collation_server est facultatif.

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
1
Gajus

Si vous êtes dérouté par votre réglage pour le client et que la connexion est réinitialisée après le redémarrage du service mysql. Essayez ces étapes (qui ont fonctionné pour moi):

  1. vi /etc/my.cnf
  2. ajoute le contenu souffle et :wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
  3. redémarrez mysql et connectez-vous mysql, utilisez la base de données, saisissez la commande status;, vous trouverez le jeu de caractères pour 'client' et 'conn' est défini sur 'utf8'.

Vérifiez le référence pour plus d'informations.

1
John Wen

Vous pouvez le faire comme ça, et si ça ne marche pas, vous devez redémarrer mysql.

0
郭浩伟