Como sugiere el título de la pregunta, estoy tratando de entender cómo funciona Wordpress con los juegos de caracteres MySQL y las opciones de clasificación. Como mostraré a continuación, las cosas no tienen mucho sentido para mí ...
Instalé Wordpress siguiendo las instrucciones en su página de instalación:
https://codex.wordpress.org/Installing_WordPress
Como parte de las instrucciones, seguí sus consejos para la creación manual de la base de datos MySQL en la línea de comandos, a saber, los comandos:
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
Además, según las instrucciones, edité el archivo "wp-config.php" para usar el juego de caracteres UTF-8:
define( 'DB_CHARSET', 'utf8' );
... y dejó la configuración de colación en blanco:
define( 'DB_COLLATE', '' );
Aquí es donde comienza la diversión ...
Si ingreso un carácter que no es parte de MySQL UTF-8, pero es parte de UTF-8 MB4, como 𝌆, en una publicación, se muestra correctamente en la página representada. Hubiera esperado que esto no suceda, ya que no he configurado el juego de caracteres en UTF-8 MB4, pero el UTF-8 más restringido (como lo define MySQL, por supuesto, no como se entiende generalmente).
Si investigo el problema en MySQL en la línea de comandos, se vuelve más extraño. Si corro
show variables like 'char%';
, obtengo esta respuesta:+--------------------------+----------------------------+ | 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/ | +--------------------------+----------------------------+
Hubiera esperado que el conjunto de caracteres de la base de datos sea UTF-8, no latin1.
Si ejecuto el comando
show variables like 'collation%';
, el resultado es:+----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+
Eso es aún más extraño, por razones obvias (no habría esperado la clasificación latin1_swedish_ci predeterminada en una base de datos UTF-8).
- Finalmente, si ejecuto
show full columns from mywpdatabase.wp_posts;
, las líneas de salida, donde el valor no es NULL, muestran que la intercalación es:
| post_content_filtered | longtext | utf8mb4_unicode_ci |
Mi pregunta entonces: ¿cómo se puede explicar esto? ¿Por qué mi instalación de Wordpress representa correctamente los caracteres UTF-8 MB4, cuando la base de datos se define como UTF-8 en la configuración? ¿Y por qué la base de datos se muestra en MySQL como latin1, colación sueca, en lugar de UTF-8? ¿Y cómo es que, a pesar de todo esto, los campos individuales en la tabla son utf8mb4_unicode_ci? Una explicación de bajo nivel de la forma en que Wordpress funciona con MySQL sería muy útil. ¡Gracias!