Come conservare il personaggio Emoji nel database MySQL


173

Sto usando il personaggio Emoji nel mio progetto. Quei personaggi vengono salvati (??) nel database mysql. Avevo usato il database Fascicolazione predefinita in utf8mb4_general_ci. Mostra

1366 Valore stringa errato: '\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...' per la colonna 'commento' alla riga 1


1
Come stai salvando i tuoi dati? Puoi mostrarci quel codice?
Tomas Buteler,

1
Grazie per il tuo commento. Ho trovato la soluzione per questa raccolta predefinita Database modifiche come ** utf8mb4 ** e anche Modifica raccolta tabelle come ** SET DI CARATTERI utf8mb4 COLLATE utf8mb4_bin **. ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Selvamani P,

1
Codice: 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'imposta utf8mb4 nella connessione al database: $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");
Selvamani P

Risposte:


31

passaggio 1, modificare il set di caratteri predefinito del database:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

passaggio 2, impostare il set di caratteri durante la creazione della tabella:

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

o modifica la tabella

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

Ho seguito queste domande e ho interrotto e riavviato il server mysql, ma quando provo a inserire emoji nella mia tabella ottengo ancora lo stesso errore. Tutti i comandi sono stati trasmessi correttamente tranne INSERT. INSERIRE IN Voci (data, ora, didascalia) VALORI (20/05/2018 ',' 12: 38: 00 ',' Descrizione del test con emoji: 😊❤️ '); Le impostazioni della colonna sono Fascicolazione: utf8mb4_0900_ai_ci Definizione: testo descrizione

1
Inoltre, la tua connessione deve essere utf8mb4 non utf8 per funzionare.
Henrik Hansen,

3
@ospider, nel passaggio 2 usi utfmb4_general_ci invece di unicode - qualche motivo per cui?
Warren,

265

1) Database: modifica regole di confronto predefinite database come utf8mb4.

2) Tabella: cambia le regole di confronto delle tabelle come CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.

Query:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3) Codice:

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) Impostare utf8mb4nella connessione al database:

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

4
È possibile senza modificare la raccolta predefinita del database?
AliN11,

23
Questo non funziona per me. Ricevo "???" invece di faccine. solo "☺" è riuscito a farlo in modo sicuro nel database.
Curious Developer

10
Potrebbe essere necessario aggiornare non solo la tabella in utf8mb4, ma ANCHE le colonne stesse, altrimenti possono comunque apparire come ?? invece di 💙.
Ael,

2
Ha funzionato per me, ma non dimenticare di riavviare MySQL.
Ravi Misra,

8
Devo correre SET NAMES utf8mb4;per iniziare a salvare le emoticon; prima di quel comando li stava salvando come??
cubbuk

18

Sia i database che le tabelle dovrebbero avere set di caratteri utf8mb4e regole di confronto utf8mb4_unicode_ci.

Quando si crea un nuovo database è necessario utilizzare:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Se si dispone di un database esistente e si desidera aggiungere supporto:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

È inoltre necessario impostare il set di caratteri e le regole di confronto corretti per le tabelle:

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

o modificalo se hai tabelle esistenti con molti dati:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Si noti che utf8_general_cinon è più consigliata la migliore pratica. Vedi le relative domande e risposte:

Qual è la differenza tra utf8_general_ci e utf8_unicode_ci su Stack Overflow.


ho un database e una tabella contenenti dati e quando eseguo la seconda istruzione alter, dice che: ERRORE 1833 (HY000): Impossibile cambiare la colonna 'id': usato in un vincolo di chiave esterna 'FK12njtf8e0jmyb45lqfpt6ad89' della tabella 'lizbazi.post'
Seyyed Mahdiyar Zerehpoush,

@SeyyedMahdiyarZerehpoush - potresti essere in grado di cavartela limitando l'aggiornamento a colonne specifiche che lo richiedono, come descritto qui: stackoverflow.com/a/15781925/1247581 ad esempioALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
theartofrain

qualche diff quando si usa utf8mb4_binvs utf8mb4_unicode_ciper le colonne?
Muhammad Omer Aslam,

14

Se stai usando Solr + Mysql + Java, puoi usare:

Questo può essere usato:

  • case1: quando non si desidera modificare DB.
  • case2: quando devi importare emoticon dal tuo Mysql al core Solr.

In questo caso, questa è una delle soluzioni per memorizzare le emoticon nel tuo sistema.

I passaggi per usarlo:

Libreria utilizzata: import java.net.URLDecoder; import java.net.URLEncoder;

  1. Usa urlEncoder per codificare la tua stringa con emoticon.
  2. Conservalo nel DB senza alterare il MysqlDB.
  3. È possibile memorizzarlo in solr core (modulo decodificato) se lo si desidera o è possibile memorizzare il modulo codificato.
  4. Quando recuperi queste emoticon da DB o Solr core ora puoi decodificarlo usando urlDecoder.

Esempio di codice:

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

Grazie per questo frammento di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Si prega di modificare la risposta di aggiungere qualche spiegazione, tra le ipotesi che hai fatto.
Toby Speight,

1
funziona come un incantesimo, l'ho usato nel modello, quindi non ho davvero bisogno di cambiare alcun codice e database solo il modello di dati sul setter e sul getter del contenuto
bowpunya

1
Le chiamate di funzione di codifica / decodifica tendono a causare problemi. Risolvi invece le impostazioni del set di caratteri nei vari punti.
Rick James,

1
Questo non sta risolvendo il problema, questo lo sta bypassando. E incontrerai una serie di problemi con questo metodo, ad esempio rallenterai l'applicazione perché devi decodificare e codificare tutto. Inoltre, se inserisci il personaggio %, la decodifica verrà interrotta.
Jonathan Laliberte,

14

Ho aggiornato il mio database e la mia tabella per l'aggiornamento da utf8 a utf8mb4 . Ma niente funziona per me. Quindi ho provato ad aggiornare il tipo di dati della colonna in BLOB , fortunatamente ha funzionato per me e i dati sono stati salvati. Anche il mio database e la mia tabella sono entrambi SET DI CARATTERI utf8 COLLATE utf8_unicode


13

Il comando per modificare la colonna è:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

E dobbiamo usare type = BLOB

L'esempio da modificare è il seguente: -

ALTER TABLE messages MODIFY content BLOB;

Ho verificato che i più recenti mySQL e altri database non debbano ''essere utilizzati nel comando su table_name, column_name ecc.

Recupera e salva dati: salva direttamente il contenuto della chat nella colonna e recupera i dati, recupera i dati come array di byte (byte[])dalla colonna db e poi convertili in ad stringes. (Codice Java)

new String((byte[]) arr) 

2
Sì. Se hai solo bisogno di memorizzare unicode come emoji in un determinato campo, la risposta accettata è troppo invadente, Cambia semplicemente il campo text/ varcharin a blobe il gioco è fatto. Follia di convertire set di caratteri e regole di confronto sull'intero DB solo per quello :)
davidkonrad,

9

La mia risposta aggiunge solo alla risposta Selvamani P.

Potrebbe anche essere necessario modificare qualsiasi SET NAMES utf8query con SET NAMES utf8mb4. Questo ha fatto il trucco per me.

Inoltre, questo è un ottimo articolo per trasferire il tuo sito Web da utf8 a utf8mb4. In particolare l'articolo fa 2 buoni punti sugli indici e sulle tabelle di riparazione dopo averli convertiti in utf8mb4:

INDICI

Quando si converte da utf8 a utf8mb4, la lunghezza massima di una colonna o chiave di indice rimane invariata in termini di byte. Pertanto, è più piccolo in termini di caratteri, poiché la lunghezza massima di un carattere è ora di quattro byte anziché tre. [...] Il motore di archiviazione InnoDB ha una lunghezza massima dell'indice di 767 byte, quindi per le colonne utf8 o utf8mb4 è possibile indicizzare un massimo di 255 o 191 caratteri, rispettivamente. Se al momento disponi di colonne utf8 con indici più lunghi di 191 caratteri, dovrai utilizzare un numero inferiore di caratteri quando usi utf8mb4.

TAVOLI DI RIPARAZIONE

Dopo aver aggiornato il server MySQL e apportato le modifiche necessarie spiegate sopra, assicurarsi di riparare e ottimizzare tutti i database e le tabelle. Non l'ho fatto subito dopo l'aggiornamento (non pensavo fosse necessario, poiché tutto sembrava funzionare bene a prima vista), e ho riscontrato alcuni strani bug in cui le istruzioni UPDATE non hanno avuto alcun effetto, anche se no sono stati generati errori.

Ulteriori informazioni sulle query per riparare le tabelle sull'articolo.


REPAIR TABLEe OPTIMIZE TABLEdovrebbe essere inutile - e ALTERha l'effetto di farli.
Rick James,

5

Il punto principale non è stato menzionato nelle risposte precedenti che,

Dobbiamo passare la stringa di query con le opzioni "useUnicode=yes"e "characterEncoding=UTF-8"nella stringa di connessione

Qualcosa come questo

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

5

Bene, non è necessario modificare il set di caratteri DB intero. Invece puoi farlo cambiando la colonna in tipo BLOB .

Messaggi ALTER TABLE MODIFICA contenuto BLOB;


3

Ho una buona soluzione per risparmiare tempo. Incontro anche lo stesso problema, ma non ho potuto risolvere questo problema con la prima risposta.

Il tuo personaggio defunto è utf-8. Ma le emoji hanno bisogno di utf8mb4 per supportarlo. Se si dispone dell'autorizzazione per modificare il file di configurazione di mysql, è possibile seguire questo passaggio.

Pertanto, procedere come segue per aggiornare il set di caratteri (da utf-8 a utf8mb4).

passaggio 1. apri my.cnf per mysql, aggiungi le seguenti righe a 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

passo 2. interrompere il servizio mysql e avviare il servizio mysql

mysql.server stop
mysql.server start

Finito! Quindi puoi controllare che il tuo personaggio sia cambiato in 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)

2

Supporto Emoji per applicazioni con stack tecnologico - mysql, java, springboot, hibernate

Applica le modifiche seguenti in mysql per il supporto 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;

Connessione DB - modifica dell'URL jdbc:

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

Nota: se il passaggio precedente non funziona, aggiornare la versione del connettore mysql alla versione 8.0.15. (mysql 5.7 funziona con connettore versione 8.0.15 per supporto unicode)


1

La soluzione più semplice per me è archiviare i dati come json_encode .

successivamente quando lo recuperi, assicurati di json_decode .

Qui non è necessario modificare le regole di confronto o il set di caratteri del database e della tabella.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.