Jak sugeruje tytuł pytania, chcę zrozumieć, jak Wordpress działa z zestawami znaków MySQL i opcjami sortowania. Jak pokażę poniżej, rzeczy nie mają dla mnie większego sensu ...
Zainstalowałem Wordpress, postępując zgodnie z instrukcjami na stronie instalacji:
https://codex.wordpress.org/Installing_WordPress
W ramach instrukcji podążyłem za ich radą ręcznego tworzenia bazy danych MySQL w wierszu poleceń, a mianowicie poleceń:
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
Ponadto, zgodnie z instrukcją, edytowałem plik „wp-config.php”, aby użyć zestawu znaków UTF-8:
define( 'DB_CHARSET', 'utf8' );
... i pozostawił ustawienie sortowania puste:
define( 'DB_COLLATE', '' );
Tutaj zaczyna się zabawa ...
Jeśli wprowadzę znak, który nie jest częścią MySQL UTF-8, ale jest częścią UTF-8 MB4, taki jak 𝌆, w poście, wyświetla się poprawnie na renderowanej stronie. Spodziewałbym się, że tak się nie stanie, ponieważ nie ustawiłem zestawu znaków na UTF-8 MB4, ale bardziej ograniczonego UTF-8 (zgodnie z definicją MySQL, oczywiście nie tak ogólnie rozumianą).
Jeśli zbadam ten problem w MySQL w wierszu poleceń, staje się dziwniejszy. Jeśli uruchomię
show variables like 'char%';
, otrzymam tę odpowiedź:+--------------------------+----------------------------+ | 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/ | +--------------------------+----------------------------+
Spodziewałbym się, że zestaw znaków bazy danych to UTF-8, a nie latin1.
Jeśli uruchomię polecenie
show variables like 'collation%';
, wynikiem będzie:+----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+
Jest to nawet dziwniejsze, z oczywistych powodów (nie spodziewałbym się domyślnego sortowania latin1_swedish_ci w bazie danych UTF-8).
- Wreszcie, jeśli uruchomię
show full columns from mywpdatabase.wp_posts;
, wiersze wyjściowe, w których wartość nie jest równa NULL, pokazują sortowanie jako:
| post_content_filtered | longtext | utf8mb4_unicode_ci |
Moje pytanie - w jaki sposób można to wyjaśnić? Dlaczego moja Wordpress poprawnie instaluje renderowanie znaków UTF-8 MB4, kiedy baza danych jest zdefiniowana jako UTF-8 w konfiguracji? I dlaczego baza danych jest wyświetlana w MySQL jako łaciński, szwedzki zestaw, zamiast UTF-8? Jak to możliwe, że pomimo tego wszystkie pola w tabeli to utf8mb4_unicode_ci? Bardzo pomocne byłoby wyjaśnienie niskiego poziomu, w jaki Wordpress współpracuje z MySQL. Dziękuję Ci!