web-dev-qa-db-fra.com

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 gère correctement les caractères UTF-8. Comment puis-je faire cela avec MySQL?

84
Ben

Mettre à jour: 

Réponse courte - Vous devriez presque toujours utiliser le jeu de caractères utf8mb4 et le classement utf8mb4_unicode_ci.

Pour modifier la base de données:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Voir: 

Réponse originale:

MySQL 4.1 et les versions ultérieures ont un jeu de caractères par défaut UTF-8. Vous pouvez le vérifier dans votre fichier my.cnf. N'oubliez pas de définir le client et le serveur les deux (default-character-set et character-set-server).

Si vous avez des données existantes que vous souhaitez convertir en UTF-8, videz votre base de données et réimportez-la au format UTF-8 en vous assurant que:

  • utilisez SET NAMES utf8 avant d'interroger/insérer dans la base de données
  • utiliser DEFAULT CHARSET=utf8 lors de la création de nouvelles tables
  • à ce stade, votre client et votre serveur MySQL doivent être en UTF-8 (voir my.cnf). N'oubliez pas que toutes les langues que vous utilisez (telles que PHP) doivent également être au format UTF-8. Certaines versions de PHP utiliseront leur propre bibliothèque cliente MySQL, qui peut ne pas être compatible avec UTF-8.

Si vous souhaitez migrer des données existantes, n'oubliez pas de sauvegarder d'abord! Il peut y avoir beaucoup de bizarreries dans les données lorsque les choses ne se passent pas comme prévu!

Quelques ressources:

71
Owen

Pour rendre cela 'permanent', dans my.cnf:

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

38
Javier

MySQL 4.1 et versions ultérieures ont un jeu de caractères par défaut appelé utf8, mais qui n’est en réalité qu’un sous-ensemble de UTF-8 (autorise uniquement les caractères de trois octets et moins).

Utilisez utf8mb4 comme jeu de caractères si vous voulez UTF-8 "complet".

30
T.W.R. Cole

La réponse courte: Utilisez utf8mb4 à 4 endroits:

  • Les octets de votre client sont utf8, pas latin1/cp1251/etc.
  • SET NAMES utf8mb4 ou quelque chose d'équivalent lors de l'établissement de la connexion du client à MySQL
  • CHARACTER SET utf8mb4 sur toutes les tables/colonnes - sauf les colonnes qui sont strictement ascii/hex/country_code/Zip_code/etc.
  • <meta charset charset=UTF-8> si vous effectuez une sortie au format HTML. (Oui, l'orthographe est différente ici.)

Plus d'informations ;
UTF8 jusqu'au bout

Les liens ci-dessus fournissent la "réponse canonique détaillée est nécessaire pour répondre à toutes les préoccupations". - Il y a une limite d'espace sur ce forum.

Modifier

En plus de CHARACTER SET utf8mb4 contenant "tous" les caractères du monde, COLLATION utf8mb4_unicode_520_ci est incontestablement le meilleur assemblage à utiliser. (Il existe également des collations en turc, en espagnol, etc., pour ceux qui veulent des nuances dans ces langues.)

19
Rick James

Le jeu de caractères est une propriété de la base de données (valeur par défaut) et de la table . Vous pouvez y jeter un coup d'œil (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;
4
extraneon

Pour changer le codage du jeu de caractères en UTF-8 pour la base de données elle-même, tapez la commande suivante dans mysql> Prompt. USE ALTER DATABASE .. Remplacez DBNAME par le nom de la base de données:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

Ceci est une copie de cette question Comment convertir un jeu de caractères de base de données MySQL et un classement en UTF-8?

2
Nyein Aung

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 utilisateur au bas de la page. Il mentionne que skip-character-set-client-handshake a une certaine importance.

1
Vlad Balan

Définissez votre database collation sur UTF-8.__ puis appliquez table collation à la base de données par défaut.

0
Gaurav Lad

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

0
Edward Z. Yang