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

334

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

Puisque c'est un peu de surcharge, nous aimerions définir cela comme paramètre par défaut dans MySQL. Pouvons-nous le faire dans /etc/my.cnf ou dans un autre emplacement?

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 sur les jeux de caractères.

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

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

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

Jorre
la source
19
Notez qu'une meilleure valeur par défaut serait utf8mb4, c'est-à-dire du vrai UTF-8 avec un support complet Unicode. Voir Comment prendre en charge Unicode complet dans les bases de données MySQL .
Mathias Bynens
@Jorre, vous opposeriez-vous à ce que cela change, cela crée en quelque utf8mb4sorte un précédent dangereux en l'état?
Evan Carroll

Réponses:

424

Pour définir la valeur par défaut sur UTF-8, vous souhaitez ajouter ce qui suit à 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 voulez changer le jeu de caractères pour une base de données existante, faites-le moi savoir ... votre question ne l'a pas spécifié directement, donc je ne sais pas si c'est ce que vous voulez faire.

NinjaCat
la source
18
Les paramètres my.cnf ci-dessus ont également fonctionné pour moi. De plus, je devais m'assurer que la table était correctement configurée, comme ALTER TABLE TableCONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Chris Livdahl
8
Ne fonctionne pas pour mysql 5.5. J'ai utilisé: <br/> [mysqld] # Modifications pour utf-8 collation-server = utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4' character-set-server = utf8mb4 et utf8mb4 ailleurs comme mentionné ci-dessus.
Champ
12
Sur Ubuntu 12.04, cela a fonctionné pour moi - si j'ai supprimé la première ligne après [mysqld].
Brandon Bertelsen
4
Il semble que le jeu de caractères par défaut ne soit plus autorisé dans la section [mysqld]
marsbard
4
Notez que si UTF-8 est ce que vous voulez, n'utilisez pas le utf8jeu de caractères de MySQL . Utilisez utf8mb4plutôt.
Mathias Bynens
255

Pour la version récente de MySQL,

default-character-set = utf8

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

Comme Justin Ball le dit dans « Mettre à 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 à ça:

    [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 la sortie de la requête est:

       +----------------------+-----------------+
       | Variable_name        | Value           |
       +----------------------+-----------------+
       | collation_connection | utf8_general_ci |
       | collation_database   | utf8_unicode_ci |
       | collation_server     | utf8_unicode_ci |
       +----------------------+-----------------+
Mustafah
la source
Votre première ligne max_allowed_packet = 64M est-elle liée de quelque façon que ce soit à ce problème UTF8?
malhal
Je l'ai character_set_filesystem | utf8. Je ne suis pas sûr, ça va?
oncle Lem
1
J'ai essayé MariaDB v5.5 et ça marche, merci! mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
2014 à 16h17
Je pense que vous n'avez pas besoin de le supprimer default-character-set, vous pouvez plutôt le remplacer par loose-default-character-set = utf8- c'est-à-dire le préfixe «lâche». Cela rend mysqlbinlogheureux, si vous avez besoin de l'utiliser - google pour: mysqlbinlog "loose-default-character-set" .
KajMagnus
Est-ce init-connect='SET NAMES utf8'vraiment nécessaire? Sinon, nous pouvons certainement nous en passer pour la performance.
datasn.io
56

Cette question a déjà beaucoup de réponses, mais Mathias Bynens a mentionné que 'utf8mb4' devrait être utilisé au lieu de 'utf8' afin d'avoir un meilleur support UTF-8 ('utf8' ne supporte pas les caractères de 4 octets, les champs sont tronqués lors de l'insertion ). Je considère que c'est une différence importante. Voici donc une autre réponse sur la façon 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 entièrement sûr de n'avoir rien oublié, je ferai de cette réponse un wiki communautaire.

Anciens 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 code ALTER suivant peut être utilisé pour convertir une table existante (sans la solution de contournement-restauration):

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

Éditer:

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


Avertissement : 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 la longueur de clé maximale 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, le tableau peut être converti.

basique6
la source
J'ai suivi vos paramètres, mais je trouve que character_set_databasec'est toujours utf8et collation_databaseest utf8_bin`. Ai-je oublié quelque chose?
Stewart
Trouvé ce que j'ai manqué. Ces 2 paramètres sont définis lors de la création de la base de données elle-même. Voir cette question; stackoverflow.com/questions/22572558/…
Stewart
1
ajouter character-set-client-handshake = FALSEà la section [mysqld], donc il utilisera toujours l'encodage par défaut même si vous vous trompez sur la couche application
Lukas Liesis
salut j'ai essayé cette solution mais je ne peux toujours pas montrer character_set_client | utf8mb4. c'est utf8. juste character_set_database utf8mb4 et character_set_server utf8mb4 sont utf8mb4 autres non modifiés. S'il vous plaît, aidez-moi
Bhavin Chauhan
@ baic6 Je suggère d'ajouter une note expliquant pourquoi seules les colonnes indexées peuvent provoquer le problème. La limitation de 767 octets est uniquement pour les colonnes indexées, coz la limitation pour les "clés". Pour les colonnes non indexées en général, cela ne s'applique pas. Si une colonne avait une valeur avec une longueur d'octet max, disons 255 caractères et les 3 octets max d'utf8 ont été utilisés, elle n'aurait besoin que de 255 * 3 octets, utf8mb4 dans ces cas n'utilisera que 3 octets, car ces caractères dans utf8mb4 aussi besoin que de 3 octets. Autrement dit, à moins qu'un caractère qui ne rentre pas dans utf8 ait été stocké dans la colonne, auquel cas les informations sont déjà perdues.
sam
55

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)
tomazzlender
la source
2
Que fait skip-character-set-client-handshakeexactement et dans quelles circonstances est-il nécessaire?
Simon East
3
@Simon, lors de l'utilisation, show variables like "%collation%";je voyais 'collation_connection' as utf8_general_ciet collation_database and collation_server as utf8_unicode_ci. L'ajout de la ligne a skip-character-set-client-handshakechangé l'entrée générale en unicode, donc les trois étaient cohérents.
Vaughany
2
Sur MySQL 5.6, la poignée de main skip-character-set-client-ne fait pas ce que @Vaughany a dit. Toute suggestion?
Ababneh A
4
Ils l' skip-character-set-client-handshakeont fait pour moi (avec le "serveur de jeu de caractères" et le "serveur de collation", bien sûr - sur Debian 7). Le init_connects n'a pas fait de différence avec ou sans le skipet semble redondant. +1 et merci.
Jeff
3
skip-character-set-client-handshake ignore les informations de jeu de caractères envoyées par le client. C'est bien de forcer un jeu de caractères spécifique lors de la communication, mais si le client attend quelque chose d'autre, cela pourrait entraîner des problèmes. Je dirais que vous feriez mieux de spécifier cela sur le client (votre application).
0b10011
31

Remarque: le fichier my.cnf se trouve à/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
М.Б.
la source
2
Remarque: cela modifie les valeurs par défaut; il ne modifie pas l'encodage des colonnes existantes.
Rick James
24

NijaCat était proche, mais a précisé la surpuissance:

Pour définir la valeur par défaut sur UTF-8, vous souhaitez ajouter ce qui suit à 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)
Derek
la source
5
Bonne réponse. Peut-être qu'une brève explication sur les parties exagérées aiderait les gens à décider exactement ce qu'ils veulent dans leur configuration.
Mike Samuel
@Derek, que fait [mysql] default-character-set=utf8-il alors?
Pacerier
1
Le groupe d'options [client] définit déjà des options pour tous les clients MySQL qui lisent le fichier my.cnf. Le groupe [mysql] définit spécifiquement les options du binaire client "mysql". Si vous souhaitez définir une option mysql qui ne s'applique pas aux autres clients, l'utilisation de ce groupe est appropriée, mais la définition de la même valeur d'option dans les deux emplacements est redondante. dev.mysql.com/doc/refman/5.6/en/option-files.html
Derek
@Mike Samuel, définir le jeu de caractères par défaut sur utf8 implique déjà le mode de classement par défaut de utf8_general_ci. D'un autre côté, "init-connect = 'SET NAMES utf8'" est une idée quelque peu intéressante, car elle tente de forcer tous les clients se connectant au serveur à utiliser utf8, mais cela est appliqué de manière incohérente en fonction des privilèges de connexion de la connexion utilisateur et je soupçonne que certains clients tiers qui se connectent peuvent être confus lorsque le serveur remplace le jeu de caractères demandé. dev.mysql.com/doc/refman/5.6/en/charset-applications.html
Derek
À [mysqld]utiliser à la character-set-serverplace dedefault-character-set
Rick James
23

J'ai aussi découvert que , après la mise default-character-set = utf8sous le [mysqld]titre, MySQL 5.5.x ne démarrait pas sous Ubuntu 12.04 (Precise Pangolin).

amiroff
la source
16
C'est le bogue MySQL # 52047 . Sous [mysqld], vous devez utiliser à la character-set-serverplace de default-character-set. (Extrêmement déroutant, je suis d'accord!)
Mathias Bynens
Oui. Déconseillé en 5.0; supprimé en 5.5.
Rick James
22

MySQL v5.5.3 et supérieur:

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

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

Remarque: L' inclusion skip-character-set-client-handshakeici évite d'avoir à inclure à la fois init-connectdans [mysqld]et default-character-setdans les sections [client]et [mysql].

mug896
la source
1
Wow, tant de réponses en double à cette question, et pourtant cela semble être la plus simple. Fonctionne également pour moi sur v5.5.44.
Justin Watt
9

Sous Xubuntu 12.04, j'ai simplement ajouté

[mysqld]
character_set_server = utf8

à /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)

Jetez également un œil à http://dev.mysql.com/doc/refman/5.6/en/charset-server.html

Falko
la source
Vous avez également besoin de [client] default-character-set = utf8 sinon, lorsque vous utilisez mysql sur la ligne de commande, il n'utilisera pas utf8, ce qui pourrait détruire les sauvegardes que vous dirigez vers un fichier.
malhal
9

Tous les paramètres répertoriés ici sont corrects, mais voici la solution la plus optimale et 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 j'ai choisi le type de classement utf8_unicode_ci en raison du problème 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 lorsque vous vous connectez en tant qu'utilisateur non SUPER !

Par exemple, la différence entre la connexion en tant qu'utilisateur SUPER et non SUPER (bien sûr en cas de classement 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 de classements sont pris en compte: pour le serveur, pour la 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 obscurs.

gahcep
la source
3
J'aimerais pouvoir lire votre article lié, mais je ne peux pas lire le russe et Google traduire n'est pas très utile pour les textes techniques. D'après ce que je peux dire, ce serait très intéressant. Pourriez-vous s'il vous plaît envisager de publier une version anglaise?
Martijn Heemels
2
Pourriez-vous expliquer quel paramètre ne parvient pas à définir le classement de connexion utilisateur SUPER? (et y a-t-il une solution)
KCD
@gahcep, Vous avez déclaré que vous utilisiez en utf8_unicode_ciraison de problèmes de performances, alors pourquoi ne pas utiliser à la utf8_binplace?
Pacerier
Salut Paceriar. Bon point. Maintenant, je ne sais pas si mon choix était correct sur l'utilisation utf8_unicode_cidu tout. Je n'ai jamais passé de temps à tester les performances.
gahcep
4

Les versions de MySQL et les distributions Linux peuvent être importantes lors de la configuration.

Cependant, les changements sous la [mysqld]section sont encouragés.

Je veux donner une courte 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 changera collation_connection en utf8_unicode_ci

init_connect='SET collation_connection = utf8_unicode_ci'

En utilisant SET NAMES:

init_connect='SET NAMES utf8'

Le SET NAMES influencera trois personnages, à savoir:

character_set_client
character_set_results
character_set_connection

Cela 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 sais pas trop à quoi cela sert. Je ne l'utilise cependant pas:

skip-character-set-client-handshake
Lihang Li
la source
La documentation note qui character_set_serverne doit pas être définie manuellement.
Brian
Quelle est donc l'approche de pointe? Nous pouvons explicitement passer le character setlors de l'établissement de la connexion à la base de données, mais cela semble un peu ennuyeux.
Lihang Li
En fait, j'ai fait une erreur. La documentation indique que character_set_database ne doit pas être défini dynamiquement. Ne mentionne pas character_set_server. Cependant, je ne suis pas sûr que vous deviez vous soucier de character_set_server, car je pense que cela n'affecte que la valeur par défaut pour une base de données nouvellement créée?
Brian
Comme je l' ai mentionné ci - dessus et je l' ai fait l'expérience à nouveau tout à l' heure, character_set_serverdans la [mysqld]section affectera character_set_databaseet character_set_server. Maintenant, je pense qu'une bonne pratique consiste à souligner explicitement le character setque vous souhaitez utiliser lors de la création d'une base de données, d'une table et d'une connexion à une base de données. Honnêtement parlant, la documentation de mysqln'est pas si facile à comprendre. Savez-vous s'il existe un moyen générique pour obtenir tous les paramètres character setet les collationparamètres dans mysql?
Lihang Li
4

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.

N'oubliez pas de redémarrer le service mysqld avec service mysqld restart.

Nguyễn Văn Tiến
la source
1

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)
Gajus
la source
1

Si vous rencontrez des problèmes pour confirmer la prise en charge du jeu de caractères du client à l'aide de MySQL Workbench, gardez à l'esprit la note suivante:

Important Toutes les connexions ouvertes par MySQL Workbench définissent automatiquement le jeu de caractères client sur utf8. La modification manuelle du jeu de caractères client, comme l'utilisation de SET NAMES ..., peut empêcher MySQL Workbench d'afficher correctement les caractères. Pour plus d'informations sur les jeux de caractères client, voir Jeux de caractères et classements de connexion.

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

paiego
la source
1

Si vous êtes confus par votre paramètre client et que conn est réinitialisé après le redémarrage du service mysql. Essayez ces étapes (qui ont fonctionné pour moi):

  1. vi /etc/my.cnf
  2. ajouter le contenu souffler 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, la commande d'entrée status;, vous trouverez le jeu de caractères pour 'client' et 'conn' est réglé sur 'utf8'.

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

John Wen
la source
0

Vous pouvez le faire comme il le fait, et si cela ne fonctionne pas, vous devez redémarrer mysql.

郭浩伟
la source
-1

Changer le caractère MySQL:

Client

default-character-set=utf8

mysqld

character_set_server=utf8

Nous ne devons pas écrire default-character-set=utf8dans mysqld, car cela pourrait entraîner une erreur comme:

start: le travail n'a pas pu démarrer

Enfin:

 +--------------------------+----------------------------+
 | 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/ |
 +--------------------------+----------------------------+
MYLOGOS
la source