109 votes

Comment faire en sorte que MySQL gère correctement UTF-8

L'une des réponses à une question que j'ai posée hier m'a suggéré de m'assurer que ma base de données peut gérer correctement les caractères UTF-8. Comment puis-je faire cela avec MySQL?

99voto

Owen Points 36009

MySQL 4.1 et supérieur a un jeu de caractères par défaut de l'UTF-8. Vous pouvez le vérifier dans votre my.cnf le fichier, n'oubliez pas de régler à la fois le client et le serveur (default-character-set et character-set-server).

Si vous avez des données que vous souhaitez convertir en UTF-8, un dump de votre base de données, et de les importer de nouveau en tant que UTF-8 s'assurer que:

  • utiliser SET NAMES utf8 avant la requête d'insertion dans la base de données
  • utiliser DEFAULT CHARSET=utf8 lors de la création de nouvelles tables
  • à ce stade, votre client MySQL et le serveur doit être en UTF-8 (voir my.cnf). souvenez-vous de toutes les langues que vous utilisez (comme PHP) doit être en UTF-8. Certaines versions de PHP à utiliser leur propre bibliothèque client MySQL, qui peuvent ne pas être en UTF-8 au courant.

Si vous ne souhaitez migrer les données existantes n'oubliez pas de sauvegarder d'abord! Beaucoup de bizarre choping de données peut se produire lorsque les choses ne vont pas comme prévu!

Quelques ressources:

47voto

Javier Points 33134

Pour rendre cela 'permanent', en my.cf :

 [client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
 

Pour vérifier, allez au client et affichez quelques variables:

 SHOW VARIABLES LIKE 'character_set%';
 

Vérifiez qu'ils sont tous utf8 , à l'exception de ..._filesystem , qui devrait être binary et ..._dir , qui pointe quelque part dans l'installation de MySQL.

4voto

extraneon Points 13362

Le jeu de caractères est une propriété de la base de données (par défaut) et de la table. Vous pouvez jeter un oeil (commandes MySQL):

 show create database foo; 
> CREATE DATABASE  `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */

show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1
 

En d'autres termes; il est assez facile de vérifier votre jeu de caractères de la base de données ou de le changer:

 ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
 

3voto

Vlad Balan Points 91

J'ai suivi la solution de Javier, mais j'ai ajouté quelques lignes différentes dans my.cnf:

 [myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8 
 

J'ai trouvé cette idée ici: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html dans le premier / seul commentaire de l'utilisateur au bas de la page. Il mentionne que le fait de passer le paquet de caractères au client a une certaine importance.

0voto

Edward Z. Yang Points 13760

Ces conseils sur MySQL et UTF-8 peuvent être utiles. Malheureusement, ils ne constituent pas une solution complète, mais des pièges courants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X