Wie aus dem Fragentitel hervorgeht, möchte ich verstehen, wie Wordpress mit MySQL-Zeichensätzen und Sortieroptionen funktioniert. Wie ich weiter unten zeigen werde, machen die Dinge für mich nicht viel Sinn ...
Ich habe Wordpress installiert, indem ich den Anweisungen auf der Installationsseite gefolgt bin:
https://codex.wordpress.org/Installing_WordPress
Als Teil der Anweisungen befolgte ich ihre Ratschläge zur manuellen Erstellung der MySQL-Datenbank in der Befehlszeile, nämlich die Befehle:
mysql> CREATE DATABASE databasename;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON databasename.* TO "wordpressusername"@"hostname"
-> IDENTIFIED BY "password";
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> EXIT
Außerdem habe ich, wie angewiesen, die Datei "wp-config.php" so bearbeitet, dass der UTF-8-Zeichensatz verwendet wird:
define( 'DB_CHARSET', 'utf8' );
... und ließ die Sortiereinstellung leer:
define( 'DB_COLLATE', '' );
Hier beginnt der Spaß ...
Wenn ich ein Zeichen, das nicht Teil von MySQL UTF-8 ist, aber Teil von UTF-8 MB4 ist, wie z. B. 𝌆, in einen Beitrag eingebe, wird es auf der gerenderten Seite korrekt angezeigt. Ich hätte erwartet, dass dies nicht passiert, da ich den Zeichensatz nicht auf UTF-8 MB4 gesetzt habe, sondern auf den eingeschränkteren UTF-8 (wie von MySQL definiert, natürlich nicht so allgemein verstanden).
Wenn ich das Problem in MySQL über die Befehlszeile untersuche, wird es seltsamer. Wenn ich renne
show variables like 'char%';
, bekomme ich folgende Antwort:+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
Ich hätte erwartet, dass der Datenbankzeichensatz UTF-8 und nicht latin1 ist.
Wenn ich den Befehl ausführe
show variables like 'collation%';
, lautet die Ausgabe:+----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+
Das ist aus offensichtlichen Gründen noch seltsamer (hätte die Standardkollatierung latin1_swedish_ci in einer UTF-8-Datenbank nicht erwartet).
- Wenn ich schließlich laufe
show full columns from mywpdatabase.wp_posts;
, zeigen die Ausgabezeilen, in denen der Wert nicht NULL ist, die folgende Kollatierung:
| post_content_filtered | longtext | utf8mb4_unicode_ci |
Meine Frage dann - wie kann das erklärt werden? Warum rendert meine Wordpress-Installation UTF-8 MB4-Zeichen korrekt, wenn die Datenbank in der Konfiguration als UTF-8 definiert ist? Und warum wird die Datenbank in MySQL als lateinische, schwedische Kollatierung anstelle von UTF-8 angezeigt? Und wie kommt es, dass die einzelnen Felder in der Tabelle trotz alledem utf8mb4_unicode_ci sind? Eine einfache Erklärung der Funktionsweise von Wordpress mit MySQL wäre sehr hilfreich. Vielen Dank!