MySQL Unicode Unterstützung

Wechseln zu: Navigation, Suche


UTF-8

UTF-8 ist ein Zeichensatz, den die meisten Webseiten verwenden. Dieser Zeichensatz codiert 1 112 064 gültige Zeichen. Um diese Zeichen zu kodieren, werden 4 Byte benötigt. Die am häufigsten vorkommenden Zeichen können mit 3 Bytes kodiert werden. MySQL verwendet standardmäßig nur 3 Bytes zum Kodieren, so dass Zeichen, die mit 4 Bytes kodiert werden (z.B. asiatische Schriftzeichen und Emojis), nicht gespeichert werden können. Alle Versuche, in einem Moodle-Text ein 4 Byte Zeichen einzugeben, führen daher zu einem Moodle-Datenbank-Fehler.

MySQL unterstützt auch UTF-8 Zeichen, die mit 4 Bytes kodiert werden, aber dafür müssen geeignete Datenbankeinstellungen vorgenommen werden. Bestehende Moodle-Datenbanken müssen daher entsprechend konfiguriert werden, um die volle MySQL-Unterstützung zu gewährleisten.

Moodle stellt dafür ein Kommandozeilen-Skript zur Konvertierung der Datenbank bereit, so dass danach UTF-8 für MySQL (und MariaDB) voll unterstützt wird. In Moodle älter als 3.1.5 und 3.2.2 hat das Skript nur die Kollation auf eine Varianten von utf8_bin umgestellt. Die empfohlene Kollation war utf8_unicode_ci. Diese unterstützt jedoch nur mit 3 Byte kodierte Zeichen. Jetzt empfehlen wir die Kollation utf8mb4_unicode_ci, die 4 Byte kodierte Zeichen unterstützt. Das Skript stellt in der Moodle-Datenbank die Kollation, den Zeichensatz, Standardtabelleneinstellungen und Tabellenspaltendefinitionen um.

Zusammenfassung:

  • Neuinstallationen ab Moodle 3.1.5 und 3.2.2 verwenden standardmäßig utf8mb4, wenn der Datenbankserver entsprechend konfiguriert ist (siehe unten).
  • Moodle-Site, die auf 3.1.5 oder 3.2.2 aktualisieren, können das Skript zur Aktualisierung auf utf8mb4 verwenden. In Moodle 3.3 zeigt eine Warnung an, dass die Datenbank UTF-8 nicht voll unterstützt und empfohlen wird, auf utf8mb4_unicode_ci umzustellen. Sie können sich aber auch dafür entscheiden, weiterhin utf8_* zu verwenden.

Folgende Einstellungen müssen geändert werden:

  • Dateiformat: Eine bestimmte Kombination von Einstellungen ist nötig, um große Indizes in Tabellenspalten vom Datentyp varchar zu erlauben. Das Dateiformat muss auf Barracuda gesetzt werden. Damit ist es möglich, das Zeilenformat auf Compressed oder Dynamic zu setzen.
  • File per table
  • Large prefix - diese Einstellung erlaubt in Kombination mit dem Zeilenformat Compressed oder Dynamic Indizes vom Datentyp varchar mit mehr als 191 Zeichen.

Im folgenden Abschnitt wird beschrieben, wie Sie diese Einstellungen ändern.

Aktualisierungsschritte

Hinweis: Sichern Sie Ihre Moodle-Datenbank, bevor Sie irgendwelche Änderungen vornehmen oder das Kommandozeilen-Skript laufen lassen!
  • Ändern Sie die Konfigurationseinstellungen für MySQL (dasselbe gilt für MariaDB). Dieser Schritt ist optional. Sie können das Skript laufen lassen, das versucht, diese Änderungen vorzunehmen. Wenn Fehler auftreten, ändern Sie die Einstellungen manuell wie folgt:
    • Unter Linux müssen Sie die Konfigurationsdatei my.cnf ändern. Diese befindet sich häufig im Verzeichnis /etc/mysql/.
    • Nehmen Sie in dieser Datei folgende Änderungen vor:
[client]
default-character-set = utf8mb4

[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake

[mysql]
default-character-set = utf8mb4
  • Starten Sie den MySQL-Server neu.
  • Lassen Sie das CLI-Kommandozeilenskript laufen, um auf den neuen Zeichensatz und auf die neue Kollation zu konvertieren (erfordert Moodle ab 3.1.5 oder 3.2.2):
$ php admin/cli/mysql_collation.php --collation=utf8mb4_unicode_ci

Hinweis: Auf großen Moodle-Sites läuft das Skript sehr langsam. Wir empfehlen die Daten zu sichern (dump) und wieder zu importieren (mit dem Parameter --skip-character-set).

  • Ändern Sie die globale Variable $CFG->dboptions in der Moodle-Konfigurationsdatei config.php, um sicherzustellen, dass Moodle bei der Verbindung mit dem MySQL-Server die richtige Kollation verwendet:
$CFG->dboptions = array(
  …
  'dbcollation' => 'utf8mb4_unicode_ci',
  …
);
  • Versuchen Sie, in einem Text in Moodle einige Emojis (z.B. 😂💩) einzufügen, um zu sehen, ob die Aktualisierung erfolgreich war.