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?
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.
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:
Supprimez cette directive et vous devriez être bon.
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
Redémarrez MySQL.
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 |
+----------------------+-----------------+
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)
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é.
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)
# ???? ????
# 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
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.
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
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)
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).
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.
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
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.
La directive a été changée en character-set-system=utf8
http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.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.
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
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'
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)
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):
vi /etc/my.cnf
:wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
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.
Vous pouvez le faire comme ça, et si ça ne marche pas, vous devez redémarrer mysql.