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?
mysql
character-encoding
Jorre
la source
la source
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 .utf8mb4
sorte un précédent dangereux en l'état?Réponses:
Pour définir la valeur par défaut sur UTF-8, vous souhaitez ajouter ce qui suit à my.cnf
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.
la source
Table
CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;[mysqld]
.utf8
jeu de caractères de MySQL . Utilisezutf8mb4
plutôt.Pour la version récente de MySQL,
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:
Supprimez cette directive et vous devriez être bon.
Ensuite, votre fichier de configuration ('/etc/my.cnf' par exemple) devrait ressembler à ça:
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:
La sortie devrait ressembler à:
Deuxième requête:
Et la sortie de la requête est:
la source
character_set_filesystem | utf8
. Je ne suis pas sûr, ça va?mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
default-character-set
, vous pouvez plutôt le remplacer parloose-default-character-set = utf8
- c'est-à-dire le préfixe «lâche». Cela rendmysqlbinlog
heureux, si vous avez besoin de l'utiliser - google pour: mysqlbinlog "loose-default-character-set" .init-connect='SET NAMES utf8'
vraiment nécessaire? Sinon, nous pouvons certainement nous en passer pour la performance.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
Config
Nouveaux paramètres
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):
É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.la source
character_set_database
c'est toujoursutf8
etcollation_database
est utf8_bin`. Ai-je oublié quelque chose?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 applicationSur MySQL 5.5 j'ai dans my.cnf
Le résultat est
la source
skip-character-set-client-handshake
exactement et dans quelles circonstances est-il nécessaire?show variables like "%collation%";
je voyais 'collation_connection' asutf8_general_ci
et collation_database and collation_server asutf8_unicode_ci
. L'ajout de la ligne askip-character-set-client-handshake
changé l'entrée générale en unicode, donc les trois étaient cohérents.skip-character-set-client-handshake
ont fait pour moi (avec le "serveur de jeu de caractères" et le "serveur de collation", bien sûr - sur Debian 7). Leinit_connect
s n'a pas fait de différence avec ou sans leskip
et semble redondant. +1 et merci.Remarque: le fichier my.cnf se trouve à
/etc/mysql/
Après avoir ajouté ces lignes:
N'oubliez pas de redémarrer le serveur:
la source
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
Ensuite, pour vérifier:
la source
[mysql] default-character-set=utf8
-il alors?[mysqld]
utiliser à lacharacter-set-server
place dedefault-character-set
J'ai aussi découvert que , après la mise
default-character-set = utf8
sous le[mysqld]
titre, MySQL 5.5.x ne démarrait pas sous Ubuntu 12.04 (Precise Pangolin).la source
[mysqld]
, vous devez utiliser à lacharacter-set-server
place dedefault-character-set
. (Extrêmement déroutant, je suis d'accord!)MySQL v5.5.3 et supérieur:
Ajoutez simplement trois lignes seulement dans la section [mysqld]:
Remarque: L' inclusion
skip-character-set-client-handshake
ici évite d'avoir à inclure à la foisinit-connect
dans[mysqld]
etdefault-character-set
dans les sections[client]
et[mysql]
.la source
Sous Xubuntu 12.04, j'ai simplement ajouté
à /etc/mysql/my.cnf
Et le résultat est
Jetez également un œil à http://dev.mysql.com/doc/refman/5.6/en/charset-server.html
la source
Tous les paramètres répertoriés ici sont corrects, mais voici la solution la plus optimale et suffisante:
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:
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 .:
utilisateur avec non-SUPER priv .:
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.
la source
utf8_unicode_ci
raison de problèmes de performances, alors pourquoi ne pas utiliser à lautf8_bin
place?utf8_unicode_ci
du tout. Je n'ai jamais passé de temps à tester les performances.La directive est devenue
character-set-system=utf8
http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html
la source
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]
Cela changera collation_connection en utf8_unicode_ci
En utilisant
SET NAMES
:Le SET NAMES influencera trois personnages, à savoir:
Cela définira
character_set_database & character_set_server
Cela n'affectera que collation_database & collation_server
Désolé, je ne sais pas trop à quoi cela sert. Je ne l'utilise cependant pas:
la source
character_set_server
ne doit pas être définie manuellement.character set
lors de l'établissement de la connexion à la base de données, mais cela semble un peu ennuyeux.character_set_server
dans la[mysqld]
section affecteracharacter_set_database
etcharacter_set_server
. Maintenant, je pense qu'une bonne pratique consiste à souligner explicitement lecharacter set
que 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 demysql
n'est pas si facile à comprendre. Savez-vous s'il existe un moyen générique pour obtenir tous les paramètrescharacter set
et lescollation
paramètres dans mysql?Sur Fedora 21
Ajouter suivre:
Sauvegarder et quitter.
N'oubliez pas de redémarrer le service mysqld avec
service mysqld restart
.la source
MySQL 5.5, tout ce dont vous avez besoin est:
collation_server
est facultatif.la source
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'
la source
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):
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 réglé sur 'utf8'.Vérifiez la référence pour plus d'informations.
la source
Vous pouvez le faire comme il le fait, et si cela ne fonctionne pas, vous devez redémarrer mysql.
la source
Changer le caractère MySQL:
Client
mysqld
Nous ne devons pas écrire
default-character-set=utf8
dans mysqld, car cela pourrait entraîner une erreur comme:Enfin:
la source