Explique cómo funciona Wordpress con el conjunto de caracteres MySQL y la intercalación a un nivel bajo

10

Como sugiere el título de la pregunta, busco entender cómo funciona Wordpress con los conjuntos de caracteres de MySQL y las opciones de intercalació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:

enlace

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 conjunto de caracteres UTF-8:

define( 'DB_CHARSET', 'utf8' );

... y dejó la configuración de intercalación en blanco:

define( 'DB_COLLATE', '' );

Aquí es donde comienza la diversión ...

  1. Si ingreso un carácter que no es parte de MySQL UTF-8, pero es parte de UTF-8 MB4, como

pregunta X-Mann 13.05.2017 - 19:58

1 respuesta

10

Hay dos definiciones en wp-config.php del sitio web de WordPress:

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
  

Hay varias cosas que son comúnmente mal entendidas. Los nombres   de constantes en esos definidos, podría sugerir que están relacionados con   la base de datos en sí. Ellos no son. Están relacionados con tablas dentro de   la base de datos.

     

La creación de la base de datos es totalmente independiente de la creación de la tabla.   WordPress no crea una base de datos y no le importa   El conjunto de caracteres y la intercalación predeterminados de la base de datos, siempre que sea posible.   conectarse a la base de datos.

     

El valor 'utf8' en los primeros medios de definición, el menos restringido   conjunto de caracteres de la familia 'utf8', que es 'utf8' o 'utf8mb4'.

Si deja sin definir las definiciones anteriores, antes de intentar instalar su sitio web, es como decirle a WordPress que tome sus propias decisiones, con respecto al conjunto de caracteres de tablas de la base de datos y la intercalación, que son compatibles con MySQL (dependiendo de la versión de MySQL) y menos limitante.

Las siguientes son las cosas que analiza WordPress para determinar sus opciones durante la instalación:

  • versión de MySQL
  • recopilación de la base de datos (en wp-config.php)

En función de la versión de MySQL, WordPress decide qué grupo de utf8 utilizar. Hay dos, que se distinguen por sus nombres: utf8 y utf8mb4 . Los juegos de caracteres del grupo utf8 , permiten almacenar un máximo de 3 bytes de caracteres. Los juegos de caracteres del grupo utf8mb4 permiten almacenar un máximo de caracteres de 4 bytes.

Ahora, WordPress verifica el valor de DB_COLLATE definido. Si está vacío, utilizará la intercalación de limitación mínima de la familia utf8 elegida, de lo contrario, utilizará el valor especificado.

Ejemplos

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
     

Si MySQL no admite utf8mb4 (versiones anteriores), entonces las tablas   el conjunto de caracteres será utf8 y la intercalación será    utf8_general_ci . De lo contrario, podemos esperar utf8mb4 y utf8mb4_unicode_520_ci , o utf8mb4_unicode_ci (depende de la versión de MySQL), respectivamente.

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', 'utf8_polish_ci');
     

Versión de MySQL más antigua - utf8 y utf8_polish_ci . MySQL mas nuevo   versión - utf8mb4 y utf8mb4_polish_ci ( _polish_ci   se respeta el sufijo)

define('DB_CHARSET', 'cp1250');
define('DB_COLLATE', 'cp1250_polish_ci');
     

Cualquier versión de MySQL - cp1250 y cp1250_polish_ci .

define('DB_CHARSET', 'cp1250');
define('DB_COLLATE', 'utf8_general_ci');
     

Cualquier versión de MySQL: error (falta de coincidencia entre el conjunto de caracteres y la intercalación)

Resumen

En la mayoría de los casos, dejar los valores de define, explicados anteriormente, sin cambios, es una buena opción. Pero, si desea que la intercalación de tablas coincida con el idioma de su sitio web, puede modificar el valor de DB_COLLATE definir, adecuadamente (por ejemplo, utf8mb4_polish_ci ).

Nota: eso explica por qué el carácter stored se almacenó y recuperó correctamente. Simplemente, el conjunto de caracteres de tus tablas pertenecía al grupo utf8mb4 , no a utf8 .

    
respondido por el Frank P. Walentynowicz 14.05.2017 - 07:48

Lea otras preguntas en las etiquetas