Come suggerisce il titolo della domanda, sto cercando di capire come Wordpress funziona con i set di caratteri e le opzioni di confronto di MySQL. Come mostrerò di seguito, le cose non hanno molto senso per me ...
Ho installato Wordpress seguendo le istruzioni sulla loro pagina di installazione:
https://codex.wordpress.org/Installing_WordPress
Come parte delle istruzioni, ho seguito i loro consigli per la creazione manuale del database MySQL sulla riga di comando, in particolare i comandi:
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
Inoltre, come indicato, ho modificato il file "wp-config.php" per utilizzare il set di caratteri UTF-8:
define( 'DB_CHARSET', 'utf8' );
... e lasciato vuota l'impostazione di confronto:
define( 'DB_COLLATE', '' );
Qui è dove inizia il divertimento ...
Se inserisco un personaggio che non fa parte di MySQL UTF-8, ma fa parte di UTF-8 MB4, come 𝌆, in un post, viene visualizzato correttamente nella pagina di rendering. Mi sarei aspettato che ciò non accadesse, poiché non ho impostato il set di caratteri su UTF-8 MB4, ma l'UTF-8 più limitato (come definito ovviamente da MySQL, non come generalmente capito).
Se analizzo il problema in MySQL dalla riga di comando, diventa più strano. Se corro
show variables like 'char%';
, ottengo questa risposta:+--------------------------+----------------------------+ | 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/ | +--------------------------+----------------------------+
Mi sarei aspettato che il set di caratteri del database fosse UTF-8, non latino1.
Se eseguo il comando
show variables like 'collation%';
, l'output è:+----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+
È ancora più strano, per ovvie ragioni (non si sarebbe aspettato il confronto latin1_swedish_ci predefinito in un database UTF-8).
- Infine, se corro
show full columns from mywpdatabase.wp_posts;
, le linee di output, dove il valore non è NULL, mostrano che le regole di confronto sono:
| post_content_filtered | longtext | utf8mb4_unicode_ci |
La mia domanda quindi: come può essere spiegato? Perché la mia installazione di Wordpress esegue correttamente il rendering dei caratteri UTF-8 MB4, quando il database è definito come UTF-8 nella configurazione? E perché il database mostra in MySQL come latin1, regole di confronto svedesi, anziché UTF-8? E come mai, nonostante tutto ciò, i singoli campi nella tabella sono utf8mb4_unicode_ci? Una spiegazione di basso livello sul modo in cui Wordpress funziona con MySQL sarebbe molto utile. Grazie!