Як показує заголовок питання, я хочу зрозуміти, як 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, а не latin1.
Якщо я запускаю команду
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, було б дуже корисно. Дякую!