Comme le titre de la question le suggère, je cherche à comprendre comment Wordpress fonctionne avec les jeux de caractères MySQL et les options de classement. Comme je vais le montrer ci-dessous, les choses n'ont pas beaucoup de sens pour moi ...
J'ai installé Wordpress en suivant les instructions sur leur page d'installation:
https://codex.wordpress.org/Installing_WordPress
Dans le cadre des instructions, j'ai suivi leurs conseils pour la création manuelle de la base de données MySQL sur la ligne de commande, à savoir les commandes:
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
De plus, comme indiqué, j'ai édité le fichier "wp-config.php" pour utiliser le jeu de caractères UTF-8:
define( 'DB_CHARSET', 'utf8' );
... et laissé le paramètre d'assemblage vide:
define( 'DB_COLLATE', '' );
Voici où le plaisir commence ...
Si j'entre un caractère qui ne fait pas partie de MySQL UTF-8, mais qui fait partie de UTF-8 MB4, comme 𝌆, dans un message, il apparaît correctement sur la page rendue. Je m'attendais à ce que cela ne se produise pas, car je n'ai pas défini le jeu de caractères sur UTF-8 MB4, mais l'UTF-8 plus restreint (tel que défini par MySQL bien sûr, pas comme généralement compris).
Si j'examine le problème dans MySQL sur la ligne de commande, cela devient plus étrange. Si je cours
show variables like 'char%';
, j'obtiens cette réponse:+--------------------------+----------------------------+ | 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/ | +--------------------------+----------------------------+
Je m'attendais à ce que le jeu de caractères de la base de données soit UTF-8, pas latin1.
Si j'exécute la commande
show variables like 'collation%';
, la sortie est:+----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+
C'est encore plus étrange, pour des raisons évidentes (je ne m'attendais pas au classement latin1_swedish_ci par défaut dans une base de données UTF-8).
- Enfin, si je lance
show full columns from mywpdatabase.wp_posts;
, les lignes de sortie, où la valeur n'est pas NULL, montrent que le classement est:
| post_content_filtered | longtext | utf8mb4_unicode_ci |
Ma question alors - comment expliquer cela? Pourquoi mon installation Wordpress affiche-t-elle correctement les caractères UTF-8 MB4, alors que la base de données est définie comme UTF-8 dans la configuration? Et pourquoi la base de données s'affiche-t-elle dans MySQL comme latin1, collation suédoise, au lieu de UTF-8? Et comment se fait-il que, malgré tout cela, les champs individuels de la table soient utf8mb4_unicode_ci? Une explication de bas niveau du fonctionnement de Wordpress avec MySQL serait très utile. Je vous remercie!