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/
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.
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)
Für mich stellte sich heraus, dass das Problem im MySQL-Client lag.
der mysql-Client aktualisiert my.cnf
s 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.
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;
_
danach erfolgreich in der Lage, Emoji in Tabelle zu speichern: