utf8 ist die alte, fehlerhafte Implementierung von UTF-8 in MySQL, die derzeit veraltet ist.
utf8mb4 ist der Name ihrer korrigierten UTF-8-Implementierung, die Sie jetzt verwenden sollten.
In ihrer fehlerhaften Version funktionieren nur die Zeichen aus dem ersten 64k-Zeichenplan – dem grundlegenden mehrsprachigen Plan –, während die anderen Zeichen als ungültig angesehen werden. Die Codepunktwerte in diesem Plan – 0 bis 65535 (von denen einige aus besonderen Gründen reserviert sind) – können durch Multibyte-Kodierungen in UTF-8 mit bis zu 3 Bytes dargestellt werden, und die erste Version von MySQL UTF-8 hat willkürlich beschlossen, dies als Grenze festzulegen. Zu keinem Zeitpunkt war diese Begrenzung eine korrekte Auslegung der UTF-8-Regeln, da UTF-8 zu keinem Zeitpunkt so definiert war, dass nur bis zu 3 Bytes pro Zeichen zulässig waren. Tatsächlich definierten die ersten Definitionen von UTF-8 bis zu 6 Bytes (mittlerweile auf 4 revidiert). Die ursprüngliche Version von MySQL war immer willkürlich eingeschränkt.
Als MySQL dies veröffentlichte, waren die Auswirkungen dieser Einschränkung nicht allzu gravierend, da sich die meisten Unicode-Zeichen in diesem ersten Bereich befanden. Seitdem wurden dem Unicode immer mehr neu definierte Zeichenbereiche mit Werten außerhalb dieses ersten Bereichs hinzugefügt. Unicode selbst definiert 17 Ebenen, obwohl bisher nur 7 davon verwendet werden.
Um den alten Code nicht durch bestimmte Annahmen zu beschädigen, behielt MySQL die fehlerhafte Implementierung bei und nannte die neue, korrigierte Version utf8mb4. Dies hat zu einiger Verwirrung geführt, da der Name fälschlicherweise so interpretiert wurde, als handele es sich um eine Art Erweiterung von UTF-8 oder eine alternative Form von UTF-8, anstatt um die Implementierung von echtem UTF-8 durch MySQL.
Zukünftige Versionen von MySQL werden die alte Version schließlich auslaufen lassen, und derzeit kann sie als veraltet betrachtet werden. In absehbarer Zukunft sollten Sie utf8mb4 verwenden, um eine korrekte UTF-8-Kodierung zu gewährleisten. Nach einer ausreichenden Zeitspanne wird das aktuelle utf8 entfernt und zu einem späteren Zeitpunkt wird utf8 wieder eingeführt, diesmal in Bezug auf die korrigierte Version, aber utf8mb4 wird weiterhin eindeutig auf die korrigierte Version verweisen.