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


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;

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');

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?


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

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


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) 

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.


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

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;


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)

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)


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.


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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.