Как следует из названия вопроса, я хочу понять, как Wordpress работает с наборами символов MySQL и параметрами сортировки. Как я покажу ниже, вещи не имеют особого смысла для меня ...
Я установил Wordpress, следуя инструкциям на их странице установки:
https://codex.wordpress.org/Installing_WordPress
Как часть инструкций, я последовал их совету по созданию базы данных MySQL вручную из командной строки, а именно:
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
Далее, в соответствии с инструкциями, я отредактировал файл "wp-config.php" для использования набора символов UTF-8:
define( 'DB_CHARSET', 'utf8' );
... и оставил параметр сортировки пустым:
define( 'DB_COLLATE', '' );
Здесь начинается самое интересное ...
Если я введу символ, который не является частью MySQL UTF-8, но является частью UTF-8 MB4, например, 𝌆, в сообщение, оно корректно отображается на отображаемой странице. Я ожидал бы, что этого не произойдет, так как я установил не UTF-8 MB4, а более ограниченный UTF-8 (как определено MySQL, конечно, не так, как обычно понимают).
Если я исследую проблему в MySQL в командной строке, это становится более странным. Если я бегу
show variables like 'char%';
, я получаю этот ответ:+--------------------------+----------------------------+ | 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/ | +--------------------------+----------------------------+
Я ожидал бы, что набор символов базы данных будет UTF-8, а не латиницей1.
Если я запускаю команду
show variables like 'collation%';
, вывод:+----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+
Это даже более странно по очевидным причинам (не ожидал, что по умолчанию сортировка latin1_swedish_ci в базе данных UTF-8).
- Наконец, если я запускаю
show full columns from mywpdatabase.wp_posts;
, выходные строки, где значение не NULL, показывают, что сортировка будет:
| post_content_filtered | longtext | utf8mb4_unicode_ci |
Тогда мой вопрос - как это можно объяснить? Почему мой Wordpress правильно устанавливает рендеринг символов UTF-8 MB4, если в конфигурации база данных определена как UTF-8? И почему база данных в MySQL отображается как latin1, шведское сопоставление, а не UTF-8? И как получилось, что, несмотря на все это, отдельные поля в таблице являются utf8mb4_unicode_ci? Низкоуровневое объяснение того, как Wordpress работает с MySQL, было бы очень полезно. Спасибо!