So speichern Sie Emoji-Zeichen in der MySQL-Datenbank

172

Ich verwende Emoji-Zeichen in meinem Projekt. Diese Zeichen werden in der MySQL-Datenbank gespeichert (??). Ich hatte die Datenbank Standardkollatierung in verwendet utf8mb4_general_ci. Es zeigt

1366 Falscher Zeichenfolgenwert: '\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...' für Spalte 'Kommentar' in Zeile 1

Selvamani P.
quelle
1
Wie speichern Sie Ihre Daten? Können Sie uns diesen Code zeigen?
Tomas Buteler
1
Vielen Dank für Ihren Kommentar. Ich habe eine Lösung für diese Standarddatenbank zum Ändern der Datenbank als ** utf8mb4 ** und auch zum Ändern der Tabellensammlung als ** CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ** gefunden. 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'Setzen Sie utf8mb4 in der Datenbankverbindung: $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");
Selvamani P

Antworten:

29

Schritt 1: Ändern Sie den Standardzeichensatz Ihrer Datenbank:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Schritt 2: Legen Sie den Zeichensatz beim Erstellen der Tabelle fest:

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

oder Tabelle ändern

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;
ospider
quelle
Ich habe diese Abfragen befolgt und den MySQL-Server gestoppt und neu gestartet, aber wenn ich versuche, Emojis in meine Tabelle einzufügen, wird immer noch der gleiche Fehler angezeigt. Alle Befehle mit Ausnahme von INSERT wurden erfolgreich übergeben. INSERT INTO Entries (Datum, Uhrzeit, Beschriftung) VALUES (2018-05-20 ', '12: 38: 00', 'Testbeschreibung mit Emoji: 😊❤️'); Die Spalteneinstellungen sind Sortierung: utf8mb4_0900_ai_ci Definition: Beschreibungstext
1
Ihre Verbindung muss außerdem utf8mb4 und nicht utf8 sein, damit sie funktioniert.
Henrik Hansen
3
@ospider, in Schritt 2 verwenden Sie utfmb4_general_ci anstelle von Unicode - aus irgendeinem Grund?
Warren
263

1) Datenbank: Ändern Sie die Standardkollatierung der Datenbank als utf8mb4.

2) Tabelle: Ändern Sie die Tabellensortierung als CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.

Abfrage:

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) In utf8mb4Datenbankverbindung setzen:

  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');
Selvamani P.
quelle
4
Ist es möglich, ohne die Standardeinstellung der Datenbank zu ändern?
AliN11
23
Das funktioniert bei mir nicht. Ich bekomme "???" statt smilies. nur "☺" schaffte es sicher in die Datenbank.
Neugieriger Entwickler
10
Möglicherweise muss nicht nur die Tabelle auf utf8mb4 aktualisiert werden, sondern auch die Spalten selbst, sonst können sie immer noch als ?? anstelle von 💙.
Ael
2
Hat für mich funktioniert, aber vergessen Sie nicht, MySQL neu zu starten.
Ravi Misra
8
Ich muss rennen SET NAMES utf8mb4;, um Emoticons zu speichern. vor diesem Befehl wurden sie als??
cubbuk
18

Sowohl die Datenbanken als auch die Tabellen sollten Zeichensatz utf8mb4und Sortierung haben utf8mb4_unicode_ci.

Beim Erstellen einer neuen Datenbank sollten Sie Folgendes verwenden:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Wenn Sie über eine vorhandene Datenbank verfügen und Unterstützung hinzufügen möchten:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Sie müssen auch den richtigen Zeichensatz und die richtige Sortierung für Ihre Tabellen festlegen :

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

oder ändern Sie es, wenn Sie vorhandene Tabellen mit vielen Daten haben:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Beachten Sie, dass dies utf8_general_cinicht mehr als bewährte Methode empfohlen wird. Siehe die entsprechenden Fragen und Antworten:

Was ist der Unterschied zwischen utf8_general_ci und utf8_unicode_ci beim Stapelüberlauf?

Samawaat
quelle
Ich habe eine Datenbank und eine Tabelle, die data.and enthält, und beim Ausführen der zweiten alter-Anweisung heißt es: FEHLER 1833 (HY000): Spalte 'id' kann nicht geändert werden: Wird in einer Fremdschlüsseleinschränkung 'FK12njtf8e0jmyb45lqfpt6ad89' der Tabelle 'lizbazi.post'
Seyyed verwendet Mahdiyar Zerehpoush
@SeyyedMahdiyarZerehpoush - Sie können möglicherweise davonkommen, Ihr Update auf bestimmte Spalten zu beschränken, die es erfordern, wie hier beschrieben: stackoverflow.com/a/15781925/1247581 zBALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
theartofrain
Gibt es Unterschiede bei der Verwendung von utf8mb4_binvs utf8mb4_unicode_cifür die Spalten?
Muhammad Omer Aslam
14

Wenn Sie Solr + MySQL + Java verwenden, können Sie Folgendes verwenden:

Dies kann verwendet werden:

  • case1: Wenn Sie die DB nicht ändern möchten.
  • Fall 2: Wenn Sie Emoticons von Ihrem MySQL in den Solr-Kern importieren müssen.

Im obigen Fall ist dies eine der Lösungen, um Ihre Emoticons in Ihrem System zu speichern.

Schritte zur Verwendung:

Verwendete Bibliothek: import java.net.URLDecoder; import java.net.URLEncoder;

  1. Verwenden Sie urlEncoder, um Ihren String mit Emoticons zu codieren.
  2. Speichern Sie es in der Datenbank, ohne die MysqlDB zu ändern.
  3. Sie können es in solr core (decodierte Form) speichern, wenn Sie möchten, oder Sie können codierte Form speichern.
  4. Wenn Sie diese Emoticons aus dem DB- oder Solr-Core abrufen, können Sie sie jetzt mit urlDecoder dekodieren.

Codebeispiel:

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
quelle
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte und sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Toby Speight
1
Arbeit wie ein Zauber, ich habe es im Modell verwendet, also muss ich wirklich keinen Code und keine Datenbank ändern, nur das Datenmodell auf dem Setter und Getter des Inhalts
Bowpunya
1
Funktionsaufrufe zum Codieren / Decodieren verursachen häufig Probleme. Korrigieren Sie stattdessen die Zeichensatzeinstellungen an den verschiedenen Stellen.
Rick James
1
Dies löst das Problem nicht, es umgeht es. Bei dieser Methode treten zahlreiche Probleme auf. Beispielsweise verlangsamen Sie Ihre Anwendung, da Sie alles dekodieren und kodieren müssen. Auch wenn Sie das Zeichen eingeben %, wird Ihre Dekodierung unterbrochen.
Jonathan Laliberte
14

Ich habe meine Datenbank und Tabelle auf ein Upgrade von utf8 auf utf8mb4 aktualisiert . Aber bei mir funktioniert nichts. Dann habe ich versucht, den Spaltendatentyp auf Blob zu aktualisieren. Zum Glück hat es bei mir funktioniert und die Daten wurden gespeichert. Sogar meine Datenbank und meine Tabelle sind CHARACTER SET utf8 COLLATE utf8_unicode

Deepak Arora
quelle
13

Der Befehl zum Ändern der Spalte lautet:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

Und wir müssen type = verwenden BLOB

Das zu ändernde Beispiel lautet wie folgt: -

ALTER TABLE messages MODIFY content BLOB;

Ich habe überprüft, dass die neuesten mySQL- und anderen Datenbanken nicht ''im Befehl für Tabellenname, Spaltenname usw. verwendet werden müssen.

Daten abrufen und speichern: Speichern Sie den Chat-Inhalt direkt in einer Spalte und rufen Sie Daten ab. Rufen Sie Daten als Byte-Array (byte[])aus der DB-Spalte ab und konvertieren Sie sie dann in stringz. B. (Java-Code).

new String((byte[]) arr) 
Harpreet
quelle
2
Ja. Wenn Sie nur Unicode wie Emojis in einem bestimmten Feld speichern müssen, ist die akzeptierte Antwort viel zu aufdringlich. Ändern Sie einfach das Feld text/ varcharin a blobund Sie sind fertig. Wahnsinn, Zeichensatz und Kollatierung auf der gesamten DB nur dafür zu konvertieren :)
Davidkonrad
9

Meine Antwort ergänzt nur die Antwort von Selvamani P.

Möglicherweise müssen Sie auch alle SET NAMES utf8Abfragen mit ändern SET NAMES utf8mb4. Das hat den Trick für mich getan.

Auch dies ist ein großer Artikel in dem Hafen Ihre Website von UTF - 8 zu utf8mb4. Insbesondere macht der Artikel zwei gute Punkte zu Indizes und zum Reparieren von Tabellen, nachdem diese in utf8mb4 konvertiert wurden:

INDEXE

Bei der Konvertierung von utf8 nach utf8mb4 bleibt die maximale Länge einer Spalte oder eines Indexschlüssels in Byte unverändert. Daher ist es in Bezug auf Zeichen kleiner, da die maximale Länge eines Zeichens jetzt vier statt drei Bytes beträgt. [...] Die InnoDB-Speicher-Engine hat eine maximale Indexlänge von 767 Byte. Für utf8- oder utf8mb4-Spalten können Sie also maximal 255 bzw. 191 Zeichen indizieren. Wenn Sie derzeit utf8-Spalten mit Indizes haben, die länger als 191 Zeichen sind, müssen Sie bei Verwendung von utf8mb4 eine kleinere Anzahl von Zeichen indizieren.

TABELLEN REPARIEREN

Stellen Sie nach dem Upgrade des MySQL-Servers und den oben erläuterten Änderungen sicher, dass alle Datenbanken und Tabellen repariert und optimiert wurden. Ich habe dies nicht sofort nach dem Upgrade getan (ich hielt es nicht für notwendig, da auf den ersten Blick alles gut zu funktionieren schien) und bin auf einige seltsame Fehler gestoßen, bei denen UPDATE-Anweisungen keine Wirkung hatten, obwohl nein Fehler wurden geworfen.

Weitere Informationen zu den Abfragen zum Reparieren von Tabellen finden Sie im Artikel.

Nicola Pedretti
quelle
REPAIR TABLEund OPTIMIZE TABLEsollte unnötig sein - und ALTERhat den Effekt, sie zu tun.
Rick James
5

Der Hauptpunkt wurde in den obigen Antworten nicht erwähnt.

Wir müssen die Abfragezeichenfolge mit den Optionen "useUnicode=yes"und "characterEncoding=UTF-8"in der Verbindungszeichenfolge übergeben

Etwas wie das

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

Nun, Sie müssen den gesamten DB-Zeichensatz nicht ändern. Stattdessen können Sie dies tun, indem Sie die Spalte in einen Blob- Typ ändern .

ALTER TABLE-Nachrichten MODIFY content BLOB;

user3855339
quelle
3

Ich habe eine gute Lösung, um Ihre Zeit zu sparen. Ich treffe auch das gleiche Problem, aber ich konnte dieses Problem mit der ersten Antwort nicht lösen.

Dein defualt Charakter ist utf-8. Aber emoji braucht utf8mb4, um es zu unterstützen. Wenn Sie die Berechtigung haben, die Konfigurationsdatei von MySQL zu überarbeiten, können Sie diesen Schritt ausführen.

Führen Sie daher den folgenden Schritt aus, um Ihren Zeichensatz zu aktualisieren (von utf-8 auf utf8mb4).

Schritt 1. Öffnen Sie Ihre my.cnf für mysql und fügen Sie die folgenden Zeilen zu Ihrer my.cnf hinzu.

[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

Schritt 2. Beenden Sie Ihren MySQL-Dienst und starten Sie den MySQL-Dienst

mysql.server stop
mysql.server start

Fertig! Dann können Sie überprüfen, ob Ihr Charakter in utf8mb4 geändert wurde.

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
quelle
2

Emoji-Unterstützung für Anwendungen mit Tech-Stack - MySQL, Java, Springboot, Ruhezustand

Übernehmen Sie die folgenden Änderungen in MySQL für die Unicode-Unterstützung.

  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;

DB-Verbindung - Änderung der JDBC-URL:

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

Hinweis - Wenn der obige Schritt nicht funktioniert, aktualisieren Sie bitte die MySQL-Connector-Version auf 8.0.15. (MySQL 5.7 funktioniert mit Connector Version 8.0.15 für Unicode-Unterstützung)

user12359502
quelle
1

Die einfachste Lösung, die für mich funktioniert, besteht darin, die Daten als json_encode zu speichern .

Stellen Sie später beim Abrufen sicher, dass Sie json_decode verwenden .

Hier müssen Sie weder die Sortierung noch den Zeichensatz der Datenbank und der Tabelle ändern.

Siddhant
quelle
0

Für alle, die versuchen, dies auf einer verwalteten MySQL-Instanz (in meinem Fall auf AWS RDS) zu lösen, bestand die einfachste Möglichkeit darin, die Parametergruppe zu ändern und den Serverzeichensatz und die Sortierung auf utf8mb4bzw. utf8mb4_binfestzulegen. Nach dem Neustart des Servers überprüft eine schnelle Abfrage die Einstellungen für Systemdatenbanken und alle neu erstellten:

SELECT * FROM information_schema.SCHEMATA S;
Myles Baker
quelle