Comment faire pour que MySQL gère correctement UTF-8
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 je peux faire ça avec MySQL?
14 réponses
mise à jour:
courte réponse - vous devriez presque toujours utiliser le jeu de caractères utf8mb4
et la collation utf8mb4_unicode_ci
.
voir:
-
le commentaire D'Aaron sur cette réponse Comment faire MySQL manipuler UTF-8 correctement
-
Quelle est la différence entre utf8_general_ci et utf8_unicode_ci
-
Guide de Conversion: https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
Réponse Originale:
MySQL 4.1 et supérieur a un jeu de caractères par défaut de UTF-8. Vous pouvez vérifier cela dans votre fichier my.cnf
, n'oubliez pas de définir à la fois client et serveur ( default-character-set
et character-set-server
).
si vous avez des données existantes que vous souhaitez convertir en UTF-8, dump votre base de données, et de l'importer en arrière comme UTF-8 en s'assurant:
- utiliser
SET NAMES utf8
avant d'effectuer une recherche / d'insérer dans la base de données - utiliser
DEFAULT CHARSET=utf8
pour créer de nouvelles tables - à ce point votre client et serveur MySQL devrait être en UTF-8 (voir
my.cnf
). rappelez-vous tout les langues que vous utilisez (comme le PHP) doivent aussi être UTF-8. Certaines versions de PHP utiliseront leur propre bibliothèque client MySQL, qui peut ne pas être consciente de L'UTF-8.
si vous voulez migrer des données existantes n'oubliez pas de sauvegarder d'abord! Beaucoup de données bizarres peuvent arriver quand les choses ne se passent pas comme prévu!
de Certaines ressources:
- migration complète UTF-8 (cdbaby.com)
- article sur UTF-8 préparation de fonctions php (à noter qu'une partie de cette information est obsolète)
Pour faire de cette "permanent", my.cnf
:
[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
pour vérifier, allez au client et montrer quelques variables:
SHOW VARIABLES LIKE 'character_set%';
Vérifiez qu'ils sont tous utf8
, sauf ..._filesystem
, qui devrait être binary
et ..._dir
, qui pointe quelque part dans L'installation MySQL.
MySQL 4.1 et supérieur a un jeu de caractères par défaut qu'il appelle utf8
mais qui est en fait seulement un sous-ensemble de UTF-8 (permet seulement des caractères de trois octets et plus petit).
utilisez utf8mb4
comme votre jeu de caractères si vous voulez" full " UTF-8.
La réponse courte: Utilisation de utf8mb4
dans 4 lieux:
- 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 au serveur MySQL -
CHARACTER SET utf8mb4
sur tous les tableaux/colonnes -- sauf les colonnes qui sont strictement ascii/hex/country_code/zip_code/etc. -
<meta charset charset=UTF-8>
si vous produisez en HTML. (Oui l' l'orthographe est différente ici.)
en savoir plus ;
UTF8 all the way
liens ci-dessus, fournir la "détaillée de la réponse canonique est nécessaire pour aborder tous les problèmes". -- Il y a une limite d'espace sur ce forum.
Modifier
In ajouté à CHARACTER SET utf8mb4
contenant" tous "les caractères du monde, COLLATION utf8mb4_unicode_520_ci
est discutable le 'meilleur collation all-around' à utiliser. (Il y a aussi des collations en turc, espagnol, etc., pour ceux qui veulent les nuances dans ces langues.)
le charset est une propriété de la base de données (par défaut) et de la table. Vous pouvez avoir un regard (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 le jeu de caractères de votre base de données ou de le modifier:
ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
pour changer L'encodage du jeu de caractères en UTF-8 pour la base de données elle-même, tapez la commande suivante à l'invite mysql>. Utilisez ALTER DATABASE
.. Remplacer DBNAME par le nom de la base de données:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
c'est une copie de cette question comment convertir un jeu de caractères et collation de base de données MySQL entier en UTF-8?
ces conseils sur MySQL et UTF-8 peuvent être utiles. Malheureusement, ils ne constituent pas une solution complète, juste pièges courants.
j'ai suivi la solution de Javier, mais j'ai ajouté quelques lignes différentes dans mon.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 en bas de page. Il mentionne que skip-character-set-client-handshake a une certaine importance.
mettez votre database collation
à UTF-8
puis appliquer table collation
à la base de données par défaut.
votre réponse est que vous pouvez configurer par Paramètres MySql. Dans ma réponse peut être quelque chose sorti de son contexte, mais c'est aussi savoir est une aide pour vous.
comment configurer Character Set
et Collation
.
pour les applications qui stockent des données en utilisant le jeu de caractères MySQL par défaut et collation (
latin1, latin1_swedish_ci
), pas de configuration particulière ne devrait être nécessaire. Si les applications nécessitent un stockage de données en utilisant un jeu de caractères différent ou de classement, vous pouvez configurer le jeu de caractères information de plusieurs façons:
- spécifier les paramètres de caractères par base de données. par exemple, applications
cette utilisation d'une base de données pourrait exiger
utf8
, alors que les demandes qui utiliser une autre base de données pourrait nécessiter des IJ. - spécifiez les paramètres de caractères au démarrage du serveur. serveur pour utiliser les paramètres donnés pour toutes les applications qui ne font pas d'autres arrangement.
- spécifier les paramètres de caractères au moment de la configuration , si vous construisez MySQL à partir de la source. Cela provoque le serveur à utiliser les paramètres donnés pour tous les applications, sans avoir à les spécifier au démarrage du serveur.
les exemples montrés ici pour votre question de définir le jeu de caractères utf8, ici aussi définir collation pour plus utile( utf8_general_ci
classement`).
spécifier les paramètres de caractères par base de données
CREATE DATABASE new_db
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
spécifier les paramètres de caractères au démarrage du serveur
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
spécifier les paramètres de caractères au moment de la configuration MySQL
shell> cmake . -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
pour voir les valeurs du jeu de caractères et du système de collation variables qui s'appliquent à votre connexion, utilisez ces instructions:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
cette réponse peut être longue, mais il y a tout le chemin, vous pouvez utiliser. Plein d'espoir, ma réponse est utile pour vous. pour plus d'information http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
Définissez votre connexion de base de données à UTF8:
if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){
//set to utf8 encoding
mysql_set_charset('utf8',$handle);
}
DATABASE CONNECTION TO UTF-8
$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());
a pu trouver une solution. Exécuté ce qui suit comme spécifié à http://technoguider.com/2015/05/utf8-set-up-in-mysql /
SET NAMES UTF8;
set collation_server = utf8_general_ci;
set default-character-set = utf8;
set init_connect = ’SET NAMES utf8′;
set character_set_server = utf8;
set character_set_client = utf8;