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?
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:
Le commentaire d'Aaron sur cette réponse Comment faire en sorte que MySQL gère correctement UTF-8
Quelle est la différence entre utf8_general_ci et utf8_unicode_ci
Guide de conversion: https://dev.mysql.com/doc/refman/5.5/fr/charset-unicode-conversion.html
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:
SET NAMES utf8
avant d'interroger/insérer dans la base de donnéesDEFAULT CHARSET=utf8
lors de la création de nouvelles tablesmy.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:
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.
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".
La réponse courte: Utilisez utf8mb4
à 4 endroits:
SET NAMES utf8mb4
ou quelque chose d'équivalent lors de l'établissement de la connexion du client à MySQLCHARACTER 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.)
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;
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?
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.
Définissez votre database collation
sur UTF-8
.__ puis appliquez table collation
à la base de données par défaut.
Ces astuces sur MySQL et UTF-8 peuvent être utiles. Malheureusement, ils ne constituent pas une solution complète, mais des pièges courants.