SQL · MySQL · MariaDB · Magento
Character Sets & Collations:
utf8mb4, Sorting und Suche

Warum MySQL's utf8 kein echtes UTF-8 ist, welche Collation für Magento und deutschen Shopbetrieb passt, und wie du sicher auf utf8mb4 migrierst.

11 Min. Lesezeit utf8mb4 · Collation · Encoding MySQL 8 · MariaDB 10.6+

Das utf8-Problem: Warum MySQL's utf8 unvollständig ist

Eines der hartnäckigsten Missverständnisse in der MySQL-Welt: Der Character Set utf8 in MySQL ist kein vollständiges UTF-8. MySQL's utf8 ist eine 3-Byte-Implementierung, die nur Unicode-Zeichen bis U+FFFF unterstützt. Das bedeutet: Emojis, viele chinesische, japanische und koreanische Zeichen (CJK) sowie seltene Schriftzeichen, die 4 Bytes im UTF-8-Encoding benötigen, können mit MySQL's utf8 nicht gespeichert werden. Der Versuch, ein Emoji in ein utf8-Feld zu schreiben, führt entweder zu einem Fehler oder — schlimmer — zum stillen Abschneiden des Wertes.

Das ist kein kleines Edge-Case-Problem. In modernen E-Commerce-Projekten sind Produktbeschreibungen mit Emojis, Kundennamen mit chinesischen Zeichen und Bewertungstexte mit 4-Byte-Zeichen absolut realistisch. Für Magento 2 ist utf8mb4 daher der korrekte und einzige empfohlene Character Set.

MySQL's interner Alias utf8 ist historisch bedingt: Als MySQL UTF-8-Support einführte, wurde nur der damalige UTF-8-Dreibyte-Bereich implementiert. Später wurde utf8mb4 als vollständige 4-Byte-UTF-8-Implementierung hinzugefügt. MySQL hat angekündigt, dass utf8 in zukünftigen Versionen als Alias für utf8mb4 behandelt werden soll — aber so lange das nicht der Fall ist, muss explizit utf8mb4 angegeben werden.

-- Check current character set settings on server and database
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

-- Check character set of a specific Magento table
SELECT TABLE_NAME, TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'magento_db'
  AND TABLE_COLLATION NOT LIKE 'utf8mb4%'
ORDER BY TABLE_NAME;

-- Find columns that are NOT utf8mb4
SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'magento_db'
  AND CHARACTER_SET_NAME IS NOT NULL
  AND CHARACTER_SET_NAME != 'utf8mb4'
ORDER BY TABLE_NAME, COLUMN_NAME;

utf8mb4: 4-Byte-Support für Emoji und CJK

utf8mb4 ist das vollständige UTF-8-Encoding für MySQL und unterstützt alle 1.112.064 gültigen Unicode-Codepoints, also alle Emojis, CJK-Zeichen und seltene Schriftzeichen. Der Name "mb4" steht für "multibyte 4" — die maximale Byte-Länge pro Zeichen. In der Praxis benötigen die meisten lateinischen Zeichen nach wie vor nur 1–3 Bytes; 4 Bytes werden nur für Zeichen oberhalb von U+FFFF verwendet.

Ein wichtiger Nebeneffekt: Mit utf8mb4 sind VARCHAR-Spalten in MySQL etwas speicherintensiver als mit Latin1, weil MySQL für den Index reservierten Speicher auf Basis der maximalen Byte-Länge des Zeichensatzes berechnet. Ein VARCHAR(100) utf8mb4-Index belegt bis zu 400 Bytes Indexspeicher statt 100 Bytes bei Latin1. Das hat Auswirkungen auf die maximale Schlüssellänge für kombinierte Indizes.

-- Demonstrate utf8 limitation vs utf8mb4
-- Try inserting a 4-byte emoji character
CREATE TABLE test_charset_utf8 (txt VARCHAR(100)) CHARACTER SET utf8;
CREATE TABLE test_charset_utf8mb4 (txt VARCHAR(100)) CHARACTER SET utf8mb4;

-- This will fail or truncate with utf8:
INSERT INTO test_charset_utf8 VALUES ('Hello ????');   -- ERROR or truncation

-- This works perfectly with utf8mb4:
INSERT INTO test_charset_utf8mb4 VALUES ('Hello ????'); -- OK

-- Check actual byte length vs character length
SELECT
  txt,
  CHAR_LENGTH(txt) AS char_length,
  LENGTH(txt) AS byte_length
FROM test_charset_utf8mb4;

Collations im Überblick: unicode_ci vs 0900_ai_ci

Eine Collation definiert, wie Zeichen verglichen und sortiert werden. Bei utf8mb4 stehen mehrere Collations zur Wahl, die unterschiedliche Trade-offs bieten. Die wichtigsten für Magento-Projekte sind:

utf8mb4_unicode_ci: Basiert auf dem Unicode Collation Algorithm (UCA) Version 5.2. Case-insensitive, accent-insensitive. Kompatibel mit älteren MySQL-Versionen, breite Tool-Unterstützung. Das ist die Standard-Collation für Magento 2 und in den meisten Fällen die richtige Wahl für bestehende Projekte.

utf8mb4_unicode_520_ci: UCA 5.2.0, verbesserte Sortierung gegenüber der älteren unicode_ci.

utf8mb4_0900_ai_ci: MySQL 8-only, basiert auf UCA 9.0.0. "ai" steht für accent-insensitive, "ci" für case-insensitive. Schneller als utf8mb4_unicode_ci durch bessere Implementierung. Für neue MySQL-8-Projekte empfehlenswert, aber nicht rückwärtskompatibel mit MariaDB oder MySQL 5.7.

utf8mb4_bin: Binärer Vergleich, case-sensitive. Performant für exakte Byte-Vergleiche, aber für Textsortierung meist ungeeignet.

-- Compare sorting behavior of different collations
SELECT DISTINCT TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'magento_db'
ORDER BY TABLE_COLLATION;

-- Test case-sensitivity difference: ci vs bin
CREATE TABLE collation_test (
  val VARCHAR(50) COLLATE utf8mb4_unicode_ci,
  val_bin VARCHAR(50) COLLATE utf8mb4_bin
);

INSERT INTO collation_test VALUES ('Hallo', 'Hallo'), ('hallo', 'hallo'), ('HALLO', 'HALLO');

-- ci: all three match
SELECT * FROM collation_test WHERE val = 'hallo';      -- returns 3 rows

-- bin: only exact match
SELECT * FROM collation_test WHERE val_bin = 'hallo';  -- returns 1 row

Collation-Effekte auf Sorting und WHERE-Klauseln

Die gewählte Collation beeinflusst nicht nur die Sortierung (ORDER BY), sondern auch, welche Zeilen ein WHERE-Vergleich zurückgibt. Mit einer case-insensitiven Collation wie utf8mb4_unicode_ci matcht WHERE name = 'max' auch Zeilen mit "MAX", "Max" oder "mAx". Das ist für die meisten Such- und Filterfunktionen in Magento gewünscht — ein Kunde der "Nike" sucht, soll auch "NIKE" und "nike" finden.

Gleichzeitig kann dieses Verhalten in manchen Kontexten unerwünscht sein: Wenn du URLs oder Codes speicherst, die case-sensitiv sind, solltest du diese Spalten mit einer _bin- oder _cs-Collation definieren oder auf Anwendungsebene normalisieren.

-- Sorting with utf8mb4_unicode_ci: accent-insensitive by default
-- 'e', 'é', 'è', 'ê' are all treated as equivalent in WHERE
SELECT * FROM catalog_product_entity_varchar
WHERE value LIKE '%café%' COLLATE utf8mb4_unicode_ci;

-- Force case-sensitive search within a ci-collated column
SELECT * FROM customer_entity
WHERE BINARY email = 'User@Example.com';    -- exact case match

-- Compare ORDER BY output with different collations
SELECT value
FROM catalog_product_entity_varchar
WHERE attribute_id = 71  -- name attribute
ORDER BY value COLLATE utf8mb4_unicode_ci
LIMIT 20;

Collation und Index-Nutzung

Ein häufig übersehener Aspekt: Wenn du in einer WHERE-Klausel oder einem JOIN eine andere Collation verwendest als die Tabellen-Collation, kann MySQL den Index nicht nutzen. Das führt zu Full Table Scans statt Index Lookups — ein erheblicher Performance-Einbruch in Magento-Tabellen mit Millionen von Zeilen.

Das passiert beispielsweise, wenn du eine Zeichenkette mit einer Collation vergleichst, die von der Spalten-Collation abweicht. MySQL muss dann jede Zeile einzeln konvertieren, um den Vergleich durchzuführen. Erkenne dieses Problem im EXPLAIN-Output durch "Using where" ohne "Using index" an einem Spaltenvergleich.

-- Problem: collation mismatch causes index skip
-- Table column: VARCHAR(255) COLLATE utf8mb4_unicode_ci  (has index)
-- Literal string with mismatched collation:

-- BAD: forces collation conversion, index not used
SELECT entity_id FROM customer_entity
WHERE email = 'user@example.com' COLLATE utf8mb4_general_ci;

-- GOOD: matches column collation, uses index
SELECT entity_id FROM customer_entity
WHERE email = 'user@example.com';  -- uses column's collation implicitly

-- Detect collation mismatches that cause index skips
EXPLAIN
SELECT entity_id FROM customer_entity
WHERE email = 'user@example.com' COLLATE utf8mb4_0900_ai_ci;
-- Look for "Using where" without "Using index" in Extra column

Deutsche Umlaute korrekt sortieren

Für deutschsprachige Magento-Shops ist die korrekte Sortierung von Umlauten (ä, ö, ü, ß) besonders wichtig. Mit utf8mb4_unicode_ci werden ä, ö, ü als ihre Basis-Buchstaben a, o, u behandelt — für Datenbanksuche funktioniert das gut, für alphabetische Sortierung in Produktlisten aber nicht immer wie erwartet. Die deutsche DIN 5007-Norm sieht vor, dass ä wie ae, ö wie oe und ü wie ue sortiert werden — das ist mit keiner der Standard-MySQL-Collations direkt möglich.

Die pragmatische Lösung: Für die Datenbank-Speicherung und -Suche bleibt utf8mb4_unicode_ci die beste Wahl. Für Anzeige-Sortierungen in der Anwendung (PHP) kann Collator aus der PHP-Intl-Extension genutzt werden, um korrekte deutsche Sortierung auf Anwendungsebene zu erzwingen. Das ist in Magento über Custom Sorting-Logic in ViewModels realisierbar.

-- Demonstrate umlaut sorting in utf8mb4_unicode_ci
SELECT name FROM (
  SELECT 'Ärger' AS name UNION ALL
  SELECT 'Apfel' UNION ALL
  SELECT 'Öl' UNION ALL
  SELECT 'Orange' UNION ALL
  SELECT 'Überraschung' UNION ALL
  SELECT 'Ulm'
) words
ORDER BY name COLLATE utf8mb4_unicode_ci;

-- Result order: Apfel, Ärger, Öl, Orange, Ulm, Überraschung
-- (ä treated as a, ö as o, ü as u in this collation)

-- For truly German DIN 5007 sorting, sort in PHP with Collator:
-- $collator = new Collator('de_DE');
-- $collator->sort($array); -- handles ä=ae, ö=oe, ü=ue correctly

Magento 2: Migration zu utf8mb4

Magento 2 setzt seit Version 2.3.1+ standardmäßig utf8mb4 als Character Set für neue Installationen voraus. Ältere Installationen, die noch mit utf8 erstellt wurden, sollten migriert werden. Die Migration erfolgt mit ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci — aber Achtung: Dieser Befehl sperrt die Tabelle für die Dauer der Konvertierung. Für große Magento-Tabellen (sales_order, catalog_product_entity_varchar) kann das bei direkter Ausführung zu Downtime führen.

-- Step 1: Convert database default charset
ALTER DATABASE magento_db
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

-- Step 2: Convert individual tables (example for key Magento tables)
ALTER TABLE catalog_product_entity
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ALTER TABLE catalog_product_entity_varchar
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ALTER TABLE customer_entity
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Step 3: Verify conversion
SELECT TABLE_NAME, TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'magento_db'
  AND TABLE_COLLATION NOT LIKE 'utf8mb4%'
LIMIT 20;

-- Step 4: Update Magento env.php connection charset
-- In app/etc/env.php under 'db' > 'connection' > 'default':
-- 'charset' => 'utf8mb4'

Für große Tabellen empfehle ich, die Migration mit pt-online-schema-change oder gh-ost durchzuführen, um Downtime zu vermeiden. Beide Tools erzeugen eine Schattentabelle mit der neuen Collation, kopieren Daten in Batches und führen einen atomaren Rename durch. Nach der Migration muss der Magento-Cache geleert und die Verbindungskonfiguration in env.php auf utf8mb4 aktualisiert werden.

Connection Charset und Anwendungsebene

Auch wenn Tabellen und Spalten korrekt auf utf8mb4 stehen, kann es zu Problemen kommen, wenn die Verbindung zwischen Magento (PHP) und MySQL nicht ebenfalls utf8mb4 verwendet. Die Verbindungs-Collation wird beim Aufbau der Verbindung festgelegt und bestimmt, wie MySQL Zeichenketten interpretiert, die über diese Verbindung ankommen.

In Magento 2 wird der Connection-Charset in app/etc/env.php unter db > connection > default > charset konfiguriert. Stelle sicher, dass hier utf8mb4 eingetragen ist. Zusätzlich sollte der MySQL-Server-Default in my.cnf auf utf8mb4 gesetzt sein, damit neue Verbindungen ohne explizite SET NAMES-Anweisung korrekt arbeiten.

-- Verify connection character set in a MySQL session
SHOW VARIABLES LIKE 'character_set_connection';
SHOW VARIABLES LIKE 'collation_connection';

-- If not utf8mb4, set it explicitly for the current session
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';

-- Recommended server defaults in /etc/mysql/mysql.conf.d/mysqld.cnf:
-- [mysqld]
-- character-set-server = utf8mb4
-- collation-server = utf8mb4_unicode_ci
-- [client]
-- default-character-set = utf8mb4

-- Check all connection-level charset settings at once
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME LIKE 'character_set%'
   OR VARIABLE_NAME LIKE 'collation%';

utf8mb4-Migration für dein Magento-Projekt?

Wir migrieren deine Magento-Datenbank sicher auf utf8mb4 — mit Online-Schema-Change, ohne Downtime und mit vollständiger Verifikation.

Jetzt Kontakt aufnehmen

Zusammenfassung

  • MySQL's utf8 ist ein 3-Byte-Alias und unterstützt keine Emojis oder 4-Byte-Zeichen — immer utf8mb4 verwenden.
  • Magento 2 verwendet seit 2.3.1+ utf8mb4 standardmäßig — ältere Installationen sollten migriert werden.
  • utf8mb4_unicode_ci ist die empfohlene Collation für Magento: case-insensitive, accent-insensitive, MariaDB-kompatibel.
  • utf8mb4_0900_ai_ci ist schneller auf MySQL 8, aber nicht MariaDB-kompatibel — für neue reine MySQL-8-Projekte gut geeignet.
  • Collation-Mismatches in WHERE-Klauseln verhindern Index-Nutzung — immer gleiche Collation in Spalte und Vergleichswert.
  • Deutsche Umlaute: utf8mb4_unicode_ci reicht für Suche; für DIN-5007-Sortierung PHP-Intl-Collator nutzen.
  • Connection-Charset in Magento env.php und MySQL my.cnf beide auf utf8mb4 setzen.

FAQ: utf8mb4 und Collations

Kann ich einfach überall utf8 durch utf8mb4 ersetzen?
Grundsätzlich ja, aber mit Vorsicht bei Index-Längen. utf8mb4 belegt bis zu 4 Bytes pro Zeichen, was bei langen VARCHAR-Spalten die InnoDB-Indexgrenze von 767 Bytes (Row Format Compact) bzw. 3072 Bytes (Dynamic) erreichen kann. In Magento 2 sind alle Tabellen im Dynamic Row Format, was die Migration unkritisch macht. Trotzdem solltest du nach der Migration alle Indizes prüfen.
Warum wird in Magento utf8mb4_unicode_ci statt utf8mb4_general_ci empfohlen?
utf8mb4_general_ci ist eine ältere, einfachere Collation mit leicht inkonsistenter Sortierung bei manchen Sonderzeichen. utf8mb4_unicode_ci implementiert den Unicode Collation Algorithm korrekt und liefert zuverlässigere Sortierungsergebnisse. Der Performance-Unterschied ist in der Praxis vernachlässigbar. Magento selbst schreibt utf8mb4_unicode_ci in seinen Installationsskripten vor.
Verliere ich Daten bei der Migration von utf8 auf utf8mb4?
Nein, utf8mb4 ist eine Obermenge von utf8 — alle Zeichen, die in utf8 gespeichert werden konnten, bleiben bei der Konvertierung erhalten. Es werden keine Daten verloren. Im Gegenteil: Nach der Migration können neu gespeicherte Daten auch 4-Byte-Zeichen enthalten, die vorher stumm abgeschnitten wurden.
Wie wirkt sich utf8mb4 auf die Speichernutzung aus?
Für rein lateinische Texte (wie die meisten deutschen Produkttexte) praktisch gar nicht, da diese Zeichen weiterhin 1–3 Bytes belegen. Der theoretische maximale Platzbedarf pro Zeichen erhöht sich von 3 auf 4 Bytes, aber da InnoDB die tatsächliche Byte-Länge speichert, nicht die maximale, wächst die Datengröße bei rein lateinischen Daten nicht merklich. Indexgrößen können sich erhöhen, weil MySQL für Index-Reservierung die maximale Byte-Länge nutzt.
Was ist der Unterschied zwischen accent-insensitive und accent-sensitive Collation?
Bei accent-insensitiven Collations (Suffix _ai) werden "e", "é", "è", "ê" als gleich behandelt — eine Suche nach "café" findet auch "cafe". Bei accent-sensitiven Collations (Suffix _as) sind diese Zeichen unterschiedlich. utf8mb4_unicode_ci ist accent-insensitive, utf8mb4_0900_as_cs ist accent-sensitive und case-sensitive.
Kann ich für einzelne Spalten eine andere Collation als die Tabellen-Collation verwenden?
Ja, Collations können auf Server-, Datenbank-, Tabellen- und Spaltenebene definiert werden — jede Ebene kann die übergeordnete überschreiben. Das ist sinnvoll für Spalten, die case-sensitive Vergleiche erfordern (z.B. API-Tokens, URL-Slugs), während der Rest der Tabelle case-insensitiv bleibt.
Warum unterscheidet sich das Suchergebnis in Magento je nach verwendeter Collation?
Magento-Katalogsuche über die Datenbank nutzt LIKE-Vergleiche, die durch die Spalten-Collation beeinflusst werden. Mit utf8mb4_unicode_ci matcht "Nike" auch "nike" und "NIKE". Wenn die Collation inkonsistent ist (z.B. Verbindung in latin1, Tabelle in utf8mb4), kann MySQL keine effizienten Index-Searches durchführen und fällt auf Full Scans zurück.
Soll ich utf8mb4_0900_ai_ci oder utf8mb4_unicode_ci für neue Magento-Projekte wählen?
Wenn du ausschließlich MySQL 8 nutzt und keine MariaDB-Kompatibilität benötigst, ist utf8mb4_0900_ai_ci die modernere Wahl — bessere Performance, aktuellere Unicode-Unterstützung. Wenn du möglicherweise auf MariaDB migrieren oder ältere MySQL-Versionen unterstützen musst, bleib bei utf8mb4_unicode_ci. Magento schreibt in seinen Installationsanleitungen utf8mb4_unicode_ci vor.
Wie überprüfe ich nach der Migration, dass alle Tabellen korrekt konvertiert wurden?
Führe nach der Migration folgende Query aus: SELECT TABLE_NAME, TABLE_COLLATION FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'magento_db' AND TABLE_COLLATION NOT LIKE 'utf8mb4%'. Das Ergebnis sollte leer sein. Zusätzlich: SELECT TABLE_NAME, COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'magento_db' AND CHARACTER_SET_NAME != 'utf8mb4' für Spalten-Level-Prüfung.
Gilt utf8mb4 auch für Magento-Volltextsuche in der Datenbank?
Magento 2 verwendet standardmäßig OpenSearch/Elasticsearch für die Volltextsuche, nicht MySQL FULLTEXT. Wenn du doch MySQL FULLTEXT nutzt (z.B. für kleinere Shops ohne OpenSearch), dann gilt: MySQL FULLTEXT-Indizes unterstützen utf8mb4_unicode_ci und utf8mb4_0900_ai_ci vollständig. Die Collation beeinflusst auch hier die Ergebnisrelevanz und Stemming-Behandlung.