Como o título da pergunta sugere, estou procurando entender como o Wordpress funciona com conjuntos de caracteres e opções de agrupamento do MySQL. Como mostrarei abaixo, as coisas não fazem muito sentido para mim ...
Instalei o Wordpress seguindo as instruções na página de instalação:
https://codex.wordpress.org/Installing_WordPress
Como parte das instruções, segui os conselhos deles para a criação manual do banco de dados MySQL na linha de comando, a saber, os 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
Além disso, conforme as instruções, editei o arquivo "wp-config.php" para usar o conjunto de caracteres UTF-8:
define( 'DB_CHARSET', 'utf8' );
... e deixou a configuração de agrupamento em branco:
define( 'DB_COLLATE', '' );
Aqui é onde a diversão começa ...
Se eu inserir um caractere que não faz parte do MySQL UTF-8, mas faz parte do UTF-8 MB4, como 𝌆, em uma postagem, ele será exibido corretamente na página renderizada. Eu esperava que isso não acontecesse, pois não defini o conjunto de caracteres para UTF-8 MB4, mas o UTF-8 mais restrito (conforme definido pelo MySQL, é claro, não como geralmente entendido).
Se eu investigar o problema no MySQL na linha de comando, ele ficará mais estranho. Se eu executar
show variables like 'char%';
, recebo esta resposta:+--------------------------+----------------------------+ | 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/ | +--------------------------+----------------------------+
Eu esperava que o conjunto de caracteres do banco de dados fosse UTF-8, não latin1.
Se eu executar o comando
show variables like 'collation%';
, a saída é:+----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+
Isso é ainda mais estranho, por razões óbvias (não seria esperado o agrupamento latin1_swedish_ci padrão em um banco de dados UTF-8).
- Finalmente, se eu executar
show full columns from mywpdatabase.wp_posts;
, as linhas de saída, onde o valor não é NULL, mostram o agrupamento como:
| post_content_filtered | longtext | utf8mb4_unicode_ci |
Minha pergunta então - como isso pode ser explicado? Por que minha instalação do Wordpress renderiza corretamente caracteres UTF-8 MB4, quando o banco de dados é definido como UTF-8 na configuração? E por que o banco de dados é exibido no MySQL como latin1, agrupamento sueco, em vez de UTF-8? E como, apesar de tudo isso, os campos individuais da tabela são utf8mb4_unicode_ci? Uma explicação de baixo nível sobre como o Wordpress trabalha com o MySQL seria muito útil. Obrigado!