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?
Réponses
Trop de publicités?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:
- complet UTF-8 de la migration (cdbaby.com)
- article sur UTF-8 préparation de fonctions php (note de cette information est obsolète)
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.
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;
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.
Ces conseils sur MySQL et UTF-8 peuvent être utiles. Malheureusement, ils ne constituent pas une solution complète, mais des pièges courants.