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 firebase database peut gérer correctement les caractères UTF-8. Comment puis-je le faire avec MySQL?

Mettre à jour:

Réponse courte – Vous devriez presque toujours utiliser les utf8mb4 et 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 ( default-character-set et character-set-server ).

Si vous avez des données existantes à convertir en UTF-8, videz votre firebase database et réimportez-la en UTF-8 en vous assurant:

  • utiliser SET NAMES utf8 avant d’interroger / insérer dans la firebase database
  • 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 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 en premier! Beaucoup de données étranges peuvent se produire lorsque les choses ne se passent pas comme prévu!

Quelques ressources:

  • effectuer la migration UTF-8 (cdbaby.com)
  • article sur la préparation UTF-8 des fonctions php (notez que certaines de ces informations sont obsolètes)

Pour rendre ce “permanent”, dans my.cnf :

 [client] default-character-set=utf8 [mysqld] character-set-server = utf8 

Pour vérifier, allez au client et affichez des 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 MySQL.

MySQL 4.1 et les versions ultérieures ont un jeu de caractères par défaut qu’il appelle utf8 mais qui n’est en réalité qu’un sous-ensemble de UTF-8 (qui ne permet que des caractères de trois octets et moins).

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

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

  • Les octets dans 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 ssortingctement ascii / hex / code_ country / code_zip / etc.
  • si vous produisez en HTML. (Oui, l’orthographe est différente ici.)

Plus d’info
UTF8 jusqu’au bout

Les liens ci-dessus fournissent la “réponse canonique détaillée requirejse 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 le meilleur classement à utiliser. (Il y a aussi des collations turques, espagnoles, etc. pour ceux qui veulent les nuances dans ces langues.)

Le jeu de caractères est une propriété de la firebase database (par défaut) et de la table. Vous pouvez jeter un coup d’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 charset de firebase database ou de le modifier:

 ALTER TABLE `foo`.`bar` CHARACTER SET utf8; 

Pour changer le codage du jeu de caractères en UTF-8 pour la firebase database elle-même, tapez la commande suivante à l’invite mysql>. USE ALTER DATABASE .. Remplacez DBNAME par le nom de la firebase database:

 ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci; 

Ceci est un doublon de cette question Comment convertir un jeu de caractères et un classement de firebase database MySQL en UTF-8?

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

J’ai suivi la solution de Javier, mais j’ai ajouté des 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 d’utilisateur au bas de la page. Il mentionne que skip-character-set-client-handshake a une certaine importance.

Définissez le database collation de votre database collation sur UTF-8 puis appliquez table collation à la firebase database par défaut.

Votre réponse est que vous pouvez configurer avec MySql Settings. Dans Ma réponse peut être quelque chose qui est sorti de son contexte, mais vous savez aussi que c’est de l’aide pour vous.
comment configurer le Character Set et le Collation .

Pour les applications qui stockent des données en utilisant le jeu de caractères et le classement MySQL par défaut ( latin1, latin1_swedish_ci ), aucune configuration spéciale ne devrait être requirejse. Si les applications nécessitent un stockage de données utilisant un jeu de caractères ou un classement différent, vous pouvez configurer les informations du jeu de caractères de plusieurs manières:

  • Spécifiez les parameters de caractère par firebase database. Par exemple, les applications qui utilisent une firebase database peuvent nécessiter utf8 , tandis que les applications utilisant une autre firebase database peuvent nécessiter un sjis.
  • Spécifiez les parameters de caractères au démarrage du serveur. Cela entraîne le serveur à utiliser les parameters donnés pour toutes les applications qui ne font pas d’autres arrangements.
  • Spécifiez les parameters de caractères au moment de la configuration , si vous générez MySQL à partir des sources. Cela oblige le serveur à utiliser les parameters donnés pour toutes les applications, sans avoir à les spécifier au démarrage du serveur.

Les exemples présentés ici pour votre question sur la définition du jeu de caractères utf8, définissent ici également le classement pour plus d’ utf8_general_ci (collation utf8_general_ci ).

Spécifier les parameters de caractère par firebase database

  CREATE DATABASE new_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; 

Spécifiez les parameters de caractères au démarrage du serveur

 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci 

Spécifier les parameters de caractères au moment de la configuration de MySQL

 shell> cmake . -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci 

Pour afficher les valeurs du jeu de caractères et des variables du système de classement 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 moyen, vous pouvez utiliser. J’espère que ma réponse vous sera utile. pour plus d’informations http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html

SET NAMES UTF8

C’est fait le tour

Définissez votre connexion de firebase database à UTF8:

  if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){ //set to utf8 encoding mysql_set_charset('utf8',$handle); } 

CONNEXION DE BASE DE DONNÉES À 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. A suivi les instructions suivantes, telles que spécifiées sur 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;