it-swarm.com.de

MySQL utf8mb4, Fehler beim Speichern von Emojis

Ich versuche, Namen von Benutzern eines Dienstes in meiner MySQL-Datenbank zu speichern. Diese Namen können Emojis wie ???????????????? enthalten (nur für Beispiele)

Nachdem ich ein wenig gesucht hatte, fand ich diesen Stackoverflow Link zu diesem Tutorial . Ich habe die Schritte befolgt und es sieht so aus, als ob alles richtig konfiguriert ist.

Ich habe eine Datenbank (Zeichensatz und Kollatierung auf utf8mb4 (_unicode_ci) festgelegt), eine Tabelle mit dem Namen TestTable, die ebenfalls auf diese Weise konfiguriert wurde, sowie eine Spalte "Text", die auf diese Weise konfiguriert wurde (VARCHAR (191) utf8mb4_unicode_ci).

Wenn ich versuche, Emojis zu speichern, erhalte ich eine Fehlermeldung:

Example of error for shortcake (????):
    Warning: #1300 Invalid utf8 character string: 'F09F8D'
    Warning: #1366 Incorrect string value: '\xF0\x9F\x8D\xB0' for column 'Text' at row 1

Der einzige Emoji, den ich richtig retten konnte, war die Sonne ☀️

Obwohl ich nicht alle versucht habe, ehrlich zu sein.

Fehlt etwas in der Konfiguration?

Bitte beachten Sie: An allen Speichertests war keine Client-Seite beteiligt. Ich benutze phpmyadmin, um die Werte manuell zu ändern und die Daten zu speichern. Die richtige Konfiguration des Clients ist also etwas, worauf ich achten werde. nachdem der Server Emojis ordnungsgemäß gespeichert hat.

Another Sidenote : Derzeit erhalte ich beim Speichern von Emojis entweder den obigen Fehler oder keinen Fehler und die Daten von Username ???? werden als Username ???? gespeichert. Fehler oder kein Fehler hängt davon ab, wie ich speichere. Beim Erstellen/Speichern über SQL-Anweisung speichere ich mit Fragezeichen, beim Inline-Bearbeiten speichere ich mit Fragezeichen, beim Bearbeiten über die Schaltfläche Bearbeiten erhalte ich den Fehler.

danke dir

EDIT 1: Okay, ich glaube, ich habe das Problem herausgefunden, aber nicht die Lösung. Es sieht so aus, als ob sich die datenbankspezifischen Variablen nicht richtig geändert haben.

Wenn ich auf meinem Server als root angemeldet bin und die Variablen auslese (global):
Verwendete Abfrage: SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

+--------------------------+--------------------+
| 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               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

Für meine Datenbank (in phpmyadmin dieselbe Abfrage) sieht es folgendermaßen aus:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8               |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8               |
| character_set_server     | utf8               |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

Wie kann ich diese Einstellungen in der spezifischen Datenbank anpassen? Auch wenn ich die ersten angezeigten Einstellungen standardmäßig habe, erhalte ich beim Erstellen einer neuen Datenbank die zweiten als Einstellungen.

Edit 2:

Hier ist meine my.cnf Datei:

[client]
port=3306
socket=/var/run/mysqld/mysqld.sock
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld_safe]
socket=/var/run/mysqld/mysqld.sock

[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
port=3306
basedir=/usr
datadir=/var/lib/mysql
tmpdir=/tmp
lc-messages-dir=/usr/share/mysql
log_error=/var/log/mysql/error.log
max_connections=200
max_user_connections=30
wait_timeout=30
interactive_timeout=50
long_query_time=5
innodb_file_per_table
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

!includedir /etc/mysql/conf.d/
57
Loki

character_set_client, _connection und _results müssen alle utf8mb4 sein, damit diese Abkürzung essbar ist.

Irgendwo setzt irgendetwas eine Teilmenge davon einzeln fest. Stöbern Sie durch die Einstellungen von my.cnf und phpmyadmin - irgendetwas stellt nicht alle drei ein.

Wenn SET NAMES utf8mb4 ausgeführt wird, sind alle drei korrekt eingestellt.

Die Sonne schien, weil es nur 3 Byte ist - E2 98 80; utf8 ist ausreichend für 3-Byte-UTF8-Kodierungen von Unicode-Zeichen.

66
Rick James

Es ist wahrscheinlich, dass Ihr Dienst/Ihre Anwendung für den Client-Zeichensatz mit "utf8" anstelle von "utf8mb4" verbunden ist. Das liegt an der Client-Anwendung.

Für eine Anwendung PHP siehe http://php.net/manual/en/function.mysql-set-charset.php oder http://php.net/manual/en/mysqli .set-charset.php

Für eine Python-Anwendung siehe https://github.com/PyMySQL/PyMySQL#example oder http://docs.sqlalchemy.org/de/latest/dialects/mysql.html#mysql-unicode

Überprüfen Sie auch, ob Ihre Spalten wirklich utf8mb4 sind. Ein direkter Weg ist wie folgt:

mysql> SELECT character_set_name FROM information_schema.`COLUMNS`  WHERE table_name = "user"   AND column_name = "displayname";
+--------------------+
| character_set_name |
+--------------------+
| utf8mb4            |
+--------------------+
1 row in set (0.00 sec)
6
Pierce

Für mich stellte sich heraus, dass das Problem im MySQL-Client lag.

der mysql-Client aktualisiert my.cnfs Zeicheneinstellung auf einem Server und führte zu einer unbeabsichtigten Zeicheneinstellung.

Also musste ich einfach character-set-client-handshake = FALSE hinzufügen. Es deaktiviert die Client-Einstellungen, um meine Char-Einstellungen zu stören.

my.cnf wäre so.

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
...

Ich hoffe es hilft.

5
user3624198

ALTER TABLE _table_name_ CHANGE _column_name_ _column_name_ VARCHAR (255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;

beispielabfrage:

_ALTER TABLE `reactions` CHANGE `emoji` `emoji` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;
_

enter image description here

danach erfolgreich in der Lage, Emoji in Tabelle zu speichern:

enter image description here

0
Saurabh Mistry