Hi,
Collation der DB, der Tabelle und der betroffenen Spalte ist utf8mb3_general_ci (das war so voreingestellt). Sollte doch also für UTF-8 passen …
Nein. Nicht für Emojis.
Das
mb3im Collation-Namen heißt: UTF8 mit maximal 3 Bytes. Das entspricht der UCS-2 Codierung. Bedeutet: 4+6+6=16 Bits für Codepoint-Nummern. Mit MB3 schaffst Du also nur die Basic Plane. Bis Unicode v3.0 gab es nichts anderes, und die Datenbankhersteller haben wohl gedacht, dass man dann mit 3 Bytes auskommt. Unicode v3.1 hat dann 2001 allen UCS-2 Verwendern einen Schreck versetzt.Vor allem bedeutet mb3, dass man intern mit 16-bit Zeichendarstellung auskommt. Für mb4 brauchst Du 32-bit Darstellung oder musst mit UTF-16 Surrogaten rumhexen, so, wie es JavaScript macht. Man braucht also entweder doppelt so viel Speicher für die Daten, oder muss für bestimmte Operationen langsameren Code verwenden.
Emojis liegen in Plane 1, deswegen funktionieren die mit der mb3-Collation nicht, du brauchst die utf8mb4_general_ci Collation. Die bietet 3+6+6+6=21 Bits = 2097152 Codepoints, das reicht für die 1114112 (17×65536) Codepoints der 17 Unicode-Planes aus.
Man kann Default-Collations auf Server-, Datenbank- und Tabellenebene eingeben. Aber wenn Du sie nachträglich änderst, werden die darunter liegenden Ebenen nicht mitgeändert. Du musst jede Spalte deiner Datenbank, die Emojis können soll, auf mb4 ändern.
Das klingt nach einer guten Erklärung.
Daß es nicht an der Verbindung zur DB liegt, hatte ich schon vermutet, da ja andere UNICODE-Chars außerhalb der ASCII-Range sauber gespeichert wurden.
Betroffen ist nur eine einzige Spalte, also werde ich die anpassen. Ich melde mich, sobald ich durch bin mit den Tests.
Auf jeden Fall schon mal auch Dir Danke für Deine Zeit!
cu,
Andreas a/k/a MudGuard