Comment stocker le caractère Emoji dans la base de données MySQL

173

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

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

Selvamani P
la source
1
Comment enregistrez-vous vos données? Pouvez-vous nous montrer ce code?
Tomas Buteler
1
Merci pour votre commentaire. J'ai trouvé une solution pour cette collection par défaut de base de données de changement en tant que ** utf8mb4 ** et également la collection de table de changement en tant que ** CHARACTER SET utf8mb4 COLLATE utf8mb4_bin **. ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Selvamani P
1
Code: insert into tablename (column1,column2,column3,column4,column5,column6,column7) values ('273','3','Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29'Définissez utf8mb4 dans la connexion à la base de données: $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");
Selvamani P

Réponses:

31

É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;

étape 2, définissez le jeu de caractères lors de la création de la table:

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

ou modifier la table

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;
ospider
la source
J'ai suivi ces requêtes et j'ai arrêté et redémarré le serveur mysql, mais lorsque j'essaye d'insérer des emojis dans ma table, j'obtiens toujours la même erreur. Toutes les commandes ont réussi sauf INSERT. INSERT INTO Entrries (date, heure, légende) VALUES (2018-05-20 ', '12: 38: 00', 'Test de description avec emoji: 😊❤️'); Les paramètres de la colonne sont Collation: utf8mb4_0900_ai_ci Définition: description text
1
Votre connexion doit également être utf8mb4 et non utf8 pour que cela fonctionne.
Henrik Hansen
3
@ospider, à l'étape 2, vous utilisez utfmb4_general_ci au lieu d'unicode - une raison pour laquelle?
Warren
265

1) Base de données: remplacez le classement par défaut de la base de données par utf8mb4.

2) Table: modifiez le classement de la table en CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.

Requete:

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', 'Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')

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

  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');
Selvamani P
la source
4
Est-ce possible sans changer la collection par défaut de la base de données?
AliN11
23
Cela ne fonctionne pas pour moi. Je reçois "???" au lieu de smileys. seulement "☺" ce sourire est arrivé à la base de données en toute sécurité.
Curious Developer
10
Il peut être nécessaire de mettre à jour non seulement la table vers utf8mb4, mais AUSSI les colonnes elles-mêmes, sinon elles peuvent toujours apparaître comme ?? au lieu de 💙.
Ael
2
A fonctionné pour moi, mais n'oubliez pas de redémarrer MySQL.
Ravi Misra
8
J'ai besoin de courir SET NAMES utf8mb4;pour commencer à enregistrer des émoticônes; avant cette commande, il les enregistrait sous??
cubbuk
18

Les bases de données et les tables doivent avoir un jeu de caractères utf8mb4et un classement utf8mb4_unicode_ci.

Lors de la création d'une nouvelle base de données, vous devez utiliser:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Si vous avez une base de données existante et que vous souhaitez ajouter un support:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Vous devez également définir le jeu de caractères et le classement corrects pour vos tables:

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

ou modifiez-le si vous avez des tables existantes avec beaucoup de données:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Notez que ce utf8_general_cin'est plus la meilleure pratique recommandée. Voir les questions et réponses associées:

Quelle est la différence entre utf8_general_ci et utf8_unicode_ci sur Stack Overflow.

samawaat
la source
J'ai une base de données et une table contenant des données.et lors de l'exécution de la deuxième instruction alter, dit que: ERREUR 1833 (HY000): Impossible de changer la colonne 'id': utilisé dans une contrainte de clé étrangère 'FK12njtf8e0jmyb45lqfpt6ad89' de la table 'lizbazi.post'
Seyyed Mahdiyar Zerehpoush
@SeyyedMahdiyarZerehpoush - vous pourrez peut-être vous en sortir en limitant votre mise à jour à des colonnes spécifiques qui le nécessitent, comme décrit ici: stackoverflow.com/a/15781925/1247581 par exempleALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
theartofrain
tout diff lors de l'utilisation de utf8mb4_binvs utf8mb4_unicode_cipour les colonnes?
Muhammad Omer Aslam
14

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

Cela peut être utilisé:

  • case1: Lorsque vous ne voulez pas modifier DB.
  • case2: 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.

Étapes pour l'utiliser:

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

  1. Utilisez urlEncoder pour encoder votre chaîne avec des émoticônes.
  2. Stockez-le dans DB sans modifier le MysqlDB.
  3. Vous pouvez le stocker dans solr core (forme décodée) si vous le souhaitez ou vous pouvez stocker sous forme codée.
  4. Lorsque vous récupérez ces émoticônes à partir du noyau DB ou Solr, vous pouvez maintenant les décoder à l'aide de 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("🇺🇸🇨🇳🇯🇵🇩🇪🔳🔺🆔🆔🆑3⃣5⃣3⃣‼〽➗➗🎦🔆🎦🔆♋♍♋♍⬅⬆⬅⬅🛂🚹🛂🛄🚳🚬💊🔧💊🗿     "));
    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;
}
Sunil Gupta
la source
Merci pour cet extrait de code, qui pourrait fournir une aide limitée et immédiate. Une explication appropriée améliorerait considérablement sa valeur à long terme en montrant pourquoi c'est une bonne solution au problème, et la rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez formulées.
Toby Speight
1
fonctionne comme un charme, je l'ai utilisé dans le modèle, donc je
n'ai
1
Les appels de fonction d'encodage / décodage ont tendance à causer des problèmes. Au lieu de cela, corrigez les paramètres du jeu de caractères aux différents endroits.
Rick James
1
Cela ne résout pas le problème, c'est le contourner. Et vous rencontrerez une foule de problèmes avec cette méthode, par exemple vous ralentirez votre application car vous devez tout décoder et encoder. De plus, si vous entrez le caractère %, votre décodage sera interrompu.
Jonathan Laliberte
14

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

Deepak Arora
la source
13

La commande pour modifier la colonne est:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

Et nous devons utiliser type = BLOB

L'exemple à modifier est le suivant: -

ALTER TABLE messages MODIFY content BLOB;

J'ai vérifié que les dernières bases de données mySQL et autres n'ont pas besoin ''d'être utilisées dans la commande sur nom_table, nom_colonne, etc.

Extraire et enregistrer les données: enregistrez directement le contenu du chat dans la colonne et pour récupérer les données, récupérez les données sous forme de tableau d'octets à (byte[])partir de la colonne db, puis convertissez-les en stringpar exemple (code Java)

new String((byte[]) arr) 
Harpreet
la source
2
Oui. Si vous avez juste besoin de stocker unicode comme des emojis dans un certain champ, la réponse acceptée est beaucoup trop intrusive, changez simplement le champ text/ varcharen a blobet vous avez terminé. Madness pour convertir charset et collation sur toute la base de données juste pour ça :)
davidkonrad
9

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

Vous devrez peut-être également modifier les SET NAMES utf8requêtes avec SET NAMES utf8mb4. Cela a fait l'affaire pour moi.

En outre, 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 convertis en utf8mb4:

LES INDICES

Lors de la conversion de utf8 en utf8mb4, la longueur maximale d'une colonne ou d'une clé d'index reste inchangée en termes d'octets. Par conséquent, il est plus petit en termes de caractères, car la longueur maximale d'un caractère est désormais de 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 lors de l'utilisation de utf8mb4.

TABLES DE RÉPARATION

Après avoir mis à niveau le serveur MySQL et effectué les modifications nécessaires expliquées ci-dessus, 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 bien fonctionner à première vue), et j'ai rencontré des bogues étranges où les instructions UPDATE n'avaient aucun effet, même si non des erreurs ont été lancées.

En savoir plus sur les requêtes pour réparer les tables dans l'article.

Nicola Pedretti
la source
REPAIR TABLEet OPTIMIZE TABLEdevrait être inutile - ALTERa pour effet de les faire.
Rick James
5

Le point principal n'a pas été mentionné dans les réponses ci-dessus:

Nous devons passer la chaîne de requête avec les options "useUnicode=yes"et la "characterEncoding=UTF-8"chaîne de connexion

Quelque chose comme ça

mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
Ashh
la source
5

Eh bien, vous n'avez pas besoin de changer le jeu de caractères Whole DB. Au lieu de cela, vous pouvez le faire en changeant la colonne en type blob .

ALTER TABLE messages MODIFY content BLOB;

user3855339
la source
3

J'ai une bonne solution pour gagner du temps. Je rencontre également le même problème mais je n'ai pas pu résoudre ce problème par la première réponse.

Votre personnage par défaut est utf-8. Mais emoji a besoin de utf8mb4 pour le supporter. Si vous avez l'autorisation de réviser le fichier de configuration de mysql, vous pouvez suivre cette étape.

Par conséquent, procédez comme suit pour mettre à niveau votre jeu de caractères (de utf-8 à utf8mb4).

étape 1. ouvrez votre my.cnf pour mysql, ajoutez ces lignes suivantes à votre my.cnf.

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'

[mysql]
default-character-set = utf8mb4


[client]
default-character-set = utf8mb4

étape 2. arrêtez votre service mysql et démarrez le service mysql

mysql.server stop
mysql.server start

Fini! Ensuite, vous pouvez vérifier que votre personnage est changé en utf8mb4.

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name            | Value                                                    |
+--------------------------+----------------------------------------------------------+
| character_set_client     | utf8mb4                                                  |
| character_set_connection | utf8mb4                                                  |
| character_set_database   | utf8mb4                                                  |
| character_set_filesystem | binary                                                   |
| character_set_results    | utf8mb4                                                  |
| character_set_server     | utf8mb4                                                  |
| character_set_system     | utf8                                                     |
| character_sets_dir       | /usr/local/Cellar/mysql@5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)
Tina Bri
la source
2

Prise en charge des emojis pour les applications ayant une pile technologique - mysql, java, springboot, hibernate

Appliquez ci-dessous les modifications dans mysql pour la prise en charge d'unicode.

  1. ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  2. ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Connexion à la base de données - Modification de l'URL jdbc:

jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8

Remarque - Si l'étape ci-dessus ne fonctionne pas, veuillez mettre à jour la version du connecteur mysql vers la version 8.0.15. (mysql 5.7 fonctionne avec la version 8.0.15 du connecteur pour le support Unicode)

user12359502
la source
1

La solution la plus simple qui fonctionne pour moi est de stocker les données sous json_encode .

plus tard, lorsque vous récupérez, assurez-vous simplement de le json_decode .

Ici, vous n'avez pas à modifier le classement ou le jeu de caractères de la base de données et de la table.

Siddhant
la source
0

Pour quiconque essaie de résoudre ce problème sur une instance MySQL gérée (dans mon cas sur AWS RDS), le moyen le plus simple était de modifier le groupe de paramètres et de définir le jeu de caractères du serveur et le classement sur utf8mb4et utf8mb4_bin, respectivement. Après le redémarrage du serveur, une requête rapide vérifie les paramètres des bases de données système et de celles nouvellement créées:

SELECT * FROM information_schema.SCHEMATA S;
Myles Baker
la source