web-dev-qa-db-fra.com

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

J'utilise le caractère Emoji dans mon projet. Ces caractères sont sauvegardé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

129
Selvamani P

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

2) Table: modifiez le classement de la table en tant que 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éfinissez utf8mb4 dans la connexion à la base de données:

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

é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 charset 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 alter table

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;
16
ospider

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

Cela peut être utilisé:

  • case1: Lorsque vous ne voulez pas modifier la base de données.
  • case2: lorsque vous devez importer des émoticônes de votre noyau 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; importer Java.net.URLEncoder;

  1. Utilisez urlEncoder pour encoder votre chaîne avec des émoticônes.
  2. Enregistrez-le dans la base de données sans modifier la base de données MysqlDB.
  3. Vous pouvez le stocker dans le noyau de solr (forme décodée) si vous le souhaitez ou vous pouvez stocker la forme codée.
  4. Lorsque vous récupérez ces émoticônes depuis le 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;
}
13
Sunil Gupta

J'ai mis à jour ma base de données et ma table pour passer de tf8 à tf8mb4. Mais rien ne fonctionne pour moi. Ensuite, j'ai essayé de mettre à jour le type de données de la colonne sur 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 CHARACTER SET utf8 COLLATE utf8_unicode

10
Deepak Arora

Les bases de données et les tables doivent avoir le jeu de caractères utf8mb4 et la collation utf8mb4_unicode_ci.

Lorsque vous créez 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 bon jeu de caractères et le bon classement pour vos tables:

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

ou changez-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 utf8_general_ci n'est plus une pratique recommandée. Voir le Q & A connexe:

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

9
samawaat

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

Vous devrez peut-être également modifier les requêtes SET NAMES utf8 avec SET NAMES utf8mb4. Cela a fait le tour pour moi.

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

INDEX

Lors de la conversion d'utf8 en utf8mb4, la longueur maximale d'une clé de colonne ou d'index n'est pas modifié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 maintenant de quatre octets au lieu de trois. [...] Le moteur de stockage InnoDB a une longueur d'index maximale de 767 octets. Par conséquent, 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 nombre de caractères plus petit lorsque vous utilisez utf8mb4.

TABLES DE REPARATION

Après avoir mis à niveau le serveur MySQL et apporté les modifications nécessaires décrites ci-dessus, veillez à réparer et à 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é quelques bugs étranges où les déclarations UPDATE n'avaient aucun effet, même si aucun des erreurs ont été jetées.

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

8
Nicola Pedretti

La commande pour modifier la colonne est:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

Et nous devons utiliser type = BLOB

Exemple à modifier est comme ci-dessous: -

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 de '' pour pouvoir être utilisé dans la commande nom_table, nom_colonne, etc.

Extraire et enregistrer les données: Enregistrez directement le contenu du chat dans la colonne et pour extraire les données, extrayez les données sous forme de tableau d'octets (byte[]) à partir de la colonne de base de données, puis convertissez-le en string par exemple. (Code Java)

new String((byte[]) arr) 
6
Harpreet

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 "characterEncoding=UTF-8" dans la chaîne de connexion

Quelque chose comme ça

_mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
_
5
Ashh

Eh bien, vous n’avez pas besoin de changer le Charset Whole DB. Au lieu de cela, vous pouvez le faire en changeant la colonne en blob type.

Messages ALTER TABLE MODIFY contenu BLOB;

0
user3855339