it-swarm.com.de

Bitte erläutern Sie, wie Wordpress mit dem MySQL-Zeichensatz und der Sortierung auf niedriger Ebene funktioniert

Wie aus dem Fragentitel hervorgeht, möchte ich verstehen, wie Wordpress mit MySQL-Zeichensätzen und Kollatierungsoptionen funktioniert. Wie ich weiter unten zeigen werde, ergeben die Dinge für mich keinen 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 deren Ratschläge zur manuellen Erstellung der MySQL-Datenbank auf der Kommandozeile, 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" bearbeitet, um den UTF-8-Zeichensatz zu verwenden:

define( 'DB_CHARSET', 'utf8' );

... und die Kollatierungseinstellung leer gelassen:

define( 'DB_COLLATE', '' );

Hier fängt der Spaß an ...

  1. Wenn ich in einen Beitrag ein Zeichen eingebe, das nicht Teil von MySQL UTF-8, sondern Teil von UTF-8 MB4 ist, wie z. B. ????, 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 das eingeschränktere UTF-8 (wie von MySQL definiert, natürlich nicht so allgemein verstanden).

  2. Wenn ich das Problem in MySQL auf der Kommandozeile untersuche, wird es seltsamer. Wenn ich show variables like 'char%'; ausführe, erhalte 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 Zeichensatz der Datenbank UTF-8 ist, nicht latin1.

  1. Wenn ich den Befehl show variables like 'collation%'; ausführe, ist 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).

  1. Wenn ich show full columns from mywpdatabase.wp_posts; ausführe, zeigen die Ausgabezeilen, in denen der Wert nicht NULL ist, die folgende Sortierung:

| post_content_filtered | longtext | utf8mb4_unicode_ci |

Meine Frage also - wie lässt sich das erklären? 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 latin1, schwedische Kollatierung, anstelle von UTF-8 angezeigt? Und warum sind die einzelnen Felder in der Tabelle trotzdem utf8mb4_unicode_ci? Eine einfache Erklärung der Funktionsweise von Wordpress mit MySQL wäre sehr hilfreich. Vielen Dank!

9
X-Mann

In wp-config.php der WordPress-Website gibt es zwei Definitionen:

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

Es gibt mehrere Dinge, die am häufigsten missverstanden werden. Die Namen der Konstanten in diesen Definitionen deuten möglicherweise darauf hin, dass sie sich auf die Datenbank selbst beziehen. Sie sind nicht. Sie beziehen sich auf Tabellen in der Datenbank.

Die Datenbankerstellung ist völlig unabhängig von der Tabellenerstellung. WordPress erstellt keine Datenbank und kümmert sich nicht um den Standardzeichensatz und die Sortierung der Datenbank, solange eine Verbindung zur Datenbank hergestellt werden kann.

Der Wert 'utf8' in der ersten Definition bedeutet, der am wenigsten eingeschränkte Zeichensatz aus der 'utf8'-Familie, der entweder' utf8 'oder' utf8mb4 'ist.

Wenn Sie die obigen Definitionen unverändert lassen, bevor Sie versuchen, Ihre Website zu installieren, wird WordPress angewiesen, eigene Entscheidungen in Bezug auf den Zeichensatz und die Sortierung der Datenbanktabellen zu treffen, die von MySQL unterstützt werden (abhängig von der MySQL-Version) und am wenigsten einschränkend sind.

Die folgenden Dinge werden von WordPress analysiert, um die Auswahlmöglichkeiten während der Installation zu bestimmen:

  • MySQL-Version
  • datenbanksortierung (in wp-config.php)

Basierend auf der MySQL-Version entscheidet WordPress, welche Gruppe von utf8 family verwendet wird. Es gibt zwei, die sich durch ihre Namen unterscheiden: utf8 und utf8mb4 . Zeichensätze aus utf8 group ermöglichen das Speichern von maximal 3 Byte langen Zeichen. Zeichensätze aus utf8mb4 group ermöglichen das Speichern von maximal 4 Byte langen Zeichen.

Jetzt prüft WordPress den Wert von DB_COLLATE define. Wenn leer, wird die am wenigsten einschränkende Sortierung aus der ausgewählten utf8 - Familie verwendet, andernfalls wird der angegebene Wert verwendet.

Beispiele

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

Wenn MySQL utf8mb4 (ältere Versionen) nicht unterstützt, lautet der Zeichensatz der Tabellen utf8 und die Sortierung utf8_general_ci . Andernfalls können wir utf8mb4 und utf8mb4_unicode_520_ci bzw. utf8mb4_unicode_ci (MySQL-versionsabhängig) erwarten.

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', 'utf8_polish_ci');

Ältere MySQL-Version - utf8 und utf8_polish_ci . Neuere MySQL-Version - utf8mb4 und utf8mb4_polish_ci ( _polish_ci Suffix wird berücksichtigt)

define('DB_CHARSET', 'cp1250');
define('DB_COLLATE', 'cp1250_polish_ci');

Beliebige MySQL-Version - cp1250 und cp1250_polish_ci .

define('DB_CHARSET', 'cp1250');
define('DB_COLLATE', 'utf8_general_ci');

Beliebige MySQL-Version - Fehler (Nichtübereinstimmung von Zeichensatz und Sortierung)

Zusammenfassung

In den meisten Fällen ist es eine gute Wahl, die oben erläuterten Werte von define unverändert zu lassen. Wenn die Sortierung der Tabellen jedoch mit der Sprache Ihrer Website übereinstimmen soll, können Sie den Wert von DB_COLLATE define entsprechend ändern (z. B. - utf8mb4_polish_ci ).

Hinweis: das erklärt, warum der Charakter ???? wurde ordnungsgemäß gespeichert und abgerufen. Ihr Tabellenzeichensatz gehörte einfach zu utf8mb4 group, nicht zu utf8 .