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?

78
demandé sur Community 2008-10-14 22:09:31

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:

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:

61
répondu Owen 2018-08-02 02:08:37

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.

36
répondu Javier 2017-05-12 11:10:23

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.

28
répondu T.W.R. Cole 2016-01-11 21:08:18

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

18
répondu Rick James 2017-05-23 12:26:17

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;
4
répondu extraneon 2008-10-14 18:32:39

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?

2
répondu Nyein Aung 2017-05-23 12:34:25

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

0
répondu Edward Z. Yang 2008-10-15 05:05:33

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.

0
répondu Vlad Balan 2012-05-20 12:14:19

mettez votre database collation à UTF-8 puis appliquer table collation à la base de données par défaut.

0
répondu Gaurav Lad 2016-01-25 08:01:34

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

-1
répondu Vipin Jain 2016-01-20 06:27:37

SET NAMES UTF8

C'est le truc

-2
répondu Claudio 2013-06-26 10:18:44

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);
  }
-2
répondu fin 2015-05-23 07:30:14

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());
-2
répondu sunil subramanya 2016-04-14 10:09:32

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;
-3
répondu Nishant 2015-06-09 08:00:07