utf8 - mysql unicode




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

Cette question a déjà beaucoup de réponses, mais Mathias Bynens a mentionné que 'utf8mb4' devrait être utilisé à la place 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 ). Je considère que c'est une différence importante. Donc, voici 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 vais faire 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'affecte 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 de restauration dump):

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 sur latin1. L'émission de SET NAMES utf8 (utf8mb4 non disponible dans cette version) définit aussi utf8.

Avertissement : Si vous avez une table utf8 avec une colonne d'index de type VARCHAR (255), elle ne peut pas être convertie dans certains cas, car la longueur maximale de la clé est dépassée (la 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.

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

Comme il s'agit d'un peu de surcharge, nous aimerions définir ceci comme paramètre par défaut dans MySQL. Pouvons-nous le faire dans /etc/my.cnf ou dans un autre endroit?

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 fait ce qui suit pour définir le charset MySQL et les variables de classement en 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?


Changer le caractère MySQL:

Client

default-character-set=utf8

mysqld

character_set_server=utf8

Nous ne devrions pas écrire default-character-set=utf8 dans 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/ |
 +--------------------------+----------------------------+


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

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

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 à utf8_unicode_ci

init_connect='SET collation_connection = utf8_unicode_ci'

En utilisant SET NAMES :

init_connect='SET NAMES utf8'

Les NOMS SET influencent trois caractères, c'est-à-dire:

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 suis pas sûr de quoi est-ce. Je ne l'utilise pas cependant:

skip-character-set-client-handshake

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

Note: Y compris skip-character-set-client-handshake évite ici d'avoir à inclure à la fois init-connect dans [mysqld] et default-character-set dans les sections [client] et [mysql] .


NijaCat était proche, mais a spécifié une 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)

Pour la version récente de MySQL,

default-character-set = utf8

provoque un problème. C'est déprécié je pense.

Comme Justin Ball le dit dans " Mise à niveau vers MySQL 5.5.12 et maintenant MySQL ne démarre pas , vous devriez:

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

  2. Alors 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, lancez 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 |
       +----------------------+-----------------+
      

Si vous êtes dérouté par votre paramètre pour 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. ajoutez le contenu 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, entrez le status; commande status; , vous trouverez le jeu de caractères pour 'client' et 'conn' est défini sur 'utf8'.

Vérifiez la reference pour plus d'informations.


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 coup d'œil à http://dev.mysql.com/doc/refman/5.6/en/charset-server.html


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.

Dernier rappelez-vous le service de redémarrage mysqld avec le service mysqld restart .


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

[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 .

S'il vous plaît noter, je choisis le type de collation utf8_unicode_ci en raison du problème de performance.

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 quand 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 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 de classements sont considérés: 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 ceci et l'article aideront à clarifier les moments peu clairs.


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





character-encoding