284 votes

Comment stocker les caractères Emoji dans une base de données MySQL ?

J'utilise le caractère Emoji dans mon projet. Ces caractères sont enregistrés ( ??) dans la base de données mysql. J'ai utilisé la collation par défaut de la base de données dans utf8mb4_general_ci . Il montre

1366 Valeur de chaîne incorrecte : ' \xF0\x9F\x98\x83\xF0\x9F... pour la colonne 'commentaire' à la ligne 1

1 votes

Comment sauvegardez-vous vos données ? Pouvez-vous nous montrer ce code ?

3 votes

Merci pour votre commentaire. J'ai trouvé une solution pour cela. Changez la collection par défaut de la base de données en **utf8mb4 ** et aussi changez la collection de la table en ** CHARACTER SET utf8mb4 COLLATE utf8mb4_bin **. ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3 votes

Code : insert into tablename (column1,column2,column3,column4,column5,column6,column7) values ('273','3','Hdhdhdhhzhzhzzhjzj ',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29' Définir utf8mb4 dans la connexion à la base de données : $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");

337voto

Selvamani P Points 1963

1) Base de données : Changer la collation par défaut de la base de données en utf8mb4 .

2) Table : Changer la collation de la table en CHARACTER SET utf8mb4 COLLATE utf8mb4_bin .

Une requête :

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3) Code :

INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdhhzhzhzzhjzj  ', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')

4) Définir utf8mb4 dans la connexion à la base de données :

  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');

10 votes

Est-ce possible sans modifier la collection par défaut de la base de données ?

0 votes

Il doit être modifié avant d'utiliser le caractère emoji.

30 votes

Cela ne fonctionne pas pour moi. J'obtiens des " ???" à la place des smileys. Seul "" ce smiley est arrivé sans encombre dans la base de données.

142voto

ospider Points 1507

Étape 1, modifiez le jeu de caractères par défaut de votre base de données :

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

si la base de données n'est pas encore créée, créez-la avec les encodages corrects :

CREATE DATABASE database_name DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_unicode_ci;

Étape 2, définir le jeu de caractères lors de la création du tableau :

CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

ou modifier la table

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name MODIFY field_name TEXT CHARSET utf8mb4;

1 votes

J'ai suivi ces requêtes et arrêté et redémarré le serveur mysql, mais lorsque j'essaie d'insérer des emojis dans ma table, j'obtiens toujours la même erreur. Toutes les commandes sont passées avec succès sauf l'INSERT. INSERT INTO Entrées (date, heure, légende) VALUES (2018-05-20', '12:38:00', 'Testing description with emoji : ') ; Les paramètres de la colonne sont Collation : utf8mb4_0900_ai_ci Definition : description text

22 votes

Votre connexion doit également être utf8mb4 et non utf8 pour que cela fonctionne.

3 votes

@ospider, dans l'étape 2 vous utilisez utfmb4_general_ci au lieu de unicode - une raison pour laquelle ?

17voto

Sunil Gupta Points 121

Si vous utilisez Solr + Mysql + Java, vous pouvez utiliser :

Il peut être utilisé :

  • cas1 : Lorsque vous ne voulez pas modifier la base de données.
  • cas2 : lorsque vous devez importer des émoticônes de votre Mysql vers le noyau Solr.

Dans le cas ci-dessus, c'est l'une des solutions pour stocker vos émoticônes dans votre système.

Marche à suivre pour l'utiliser :

Bibliothèque utilisée : import java.net.URLDecoder ; import java.net.URLEncoder ;

  1. Utilisez urlEncoder pour encoder votre chaîne comportant des émoticônes.
  2. Stockez-le dans la base de données sans modifier le MysqlDB.
  3. Vous pouvez le stocker dans le noyau de Solr (forme décodée) si vous voulez ou vous pouvez stocker sous forme codée.
  4. Lorsque vous récupérez ces émoticônes à partir de la base de données ou du noyau Solr, vous pouvez maintenant les décoder. en utilisant urlDecoder.

Exemple de code :

import java.net.URLDecoder;
import java.net.URLEncoder;

public static void main(String[] args) {
    //SpringApplication.run(ParticipantApplication.class, args);
    System.out.println(encodeStringUrl("353     "));
    System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}

public static String encodeStringUrl(String url) {
    String encodedUrl =null;
    try {
         encodedUrl = URLEncoder.encode(url, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return encodedUrl;
    }
    return encodedUrl;
}

public static String decodeStringUrl(String encodedUrl) {
    String decodedUrl =null;
    try {
         decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return decodedUrl;
    }
    return decodedUrl;
}

0 votes

Merci pour cet extrait de code, qui pourrait apporter une aide limitée et immédiate. Une bonne explication améliorerait grandement sa valeur à long terme en montrant pourquoi il s'agit d'une bonne solution au problème, et elle serait plus utile aux futurs lecteurs ayant d'autres questions similaires. S'il vous plaît editar votre réponse pour ajouter des explications, y compris les hypothèses que vous avez faites.

1 votes

Les appels de fonction de codage/décodage ont tendance à causer des problèmes. Corrigez plutôt les paramètres du jeu de caractères dans les différents endroits.

1 votes

Cela ne résout pas le problème, cela le contourne. Et vous rencontrerez une foule de problèmes avec cette méthode, par exemple vous ralentirez votre application car vous devrez tout décoder et coder. De plus, si vous entrez le caractère % votre décodage sera interrompu.

15voto

Deepak Arora Points 51

J'ai mis à jour ma base de données et ma table pour la mettre à jour à partir de utf8 a utf8mb4 . Mais rien ne fonctionne pour moi. Ensuite, j'ai essayé de mettre à jour le type de données de la colonne à blob Heureusement, cela a fonctionné pour moi et les données ont été sauvegardées. Même ma base de données et ma table sont toutes deux CHARACTER SET utf8 COLLATE utf8_unicode

12voto

Nicola Pedretti Points 1657

Ma réponse ne fait qu'ajouter à la réponse de Selvamani P.

Vous devrez peut-être aussi modifier les SET NAMES utf8 des requêtes avec SET NAMES utf8mb4 . Cela a fait l'affaire pour moi.

Aussi, c'est un excellent article pour porter votre site web de utf8 à utf8mb4. En particulier, l'article fait 2 bons points sur les index et la réparation des tables après les avoir converties en utf8mb4 :

INDEXES

Lors de la conversion de utf8 en utf8mb4, la longueur maximale d'une clé de colonne ou d'index reste inchangée en termes d'octets. ou d'une clé d'index est inchangée en termes d'octets. Par conséquent, elle est plus petite en termes de caractères, parce que la longueur maximale d'un caractère est quatre octets au lieu de trois. [...] Le moteur de stockage InnoDB a une longueur d'index maximale de 767 octets, donc pour les colonnes utf8 ou utf8mb4, vous pouvez indexer un maximum de 255 ou 191 caractères, respectivement. Si vous avez actuellement des colonnes utf8 avec des index de plus de 191 caractères, vous devrez indexer un plus petit nombre de caractères en utilisant utf8mb4.

RÉPARATION DES TABLES

Après avoir mis à niveau le serveur MySQL et effectué les modifications nécessaires nécessaires, assurez-vous de réparer et d'optimiser toutes les bases de données et tables. Je ne l'ai pas fait tout de suite après la mise à niveau (je ne pensais pas que c'était nécessaire, car tout semblait fonctionner correctement à première vue). nécessaire, puisque tout semblait fonctionner correctement à première vue), et j'ai rencontré des bogues étranges où les instructions UPDATE n'avaient aucun n'avaient aucun effet, même si aucune erreur n'était signalée.

Pour en savoir plus sur les requêtes permettant de réparer les tables, consultez l'article.

0 votes

REPAIR TABLE y OPTIMIZE TABLE ne devrait pas être nécessaire - un ALTER a pour effet de les faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X