DB_COLLATE en WordPress

Reading time aprox: 7 minutes

DB_COLLATE en WordPress.

Esta es una de esas cosas que se suele pasar sobre ellas «de puntillas», una vez que se ha hecho la instalación de WordPress (manual o automáticamente) no se vuelve a mirar; incluso en la instalación, es algo que «está ahí» y ya está.

Pero no por eso, carece de importancia; sobre todo si piensas escribir tu bitácora en un idioma distinto del ingles o, alguna parte de tu bitácora contiene caracteres en otro idioma.

DB_COLLATE en WordPress

Como ya sabes, WordPress es un CMS1 que funciona apoyado en una base de datos de tipo SQL2.

Por tanto, aunque hablamos de WordPress, antes tenemos que entender la función del parámetro «collation» en una base de datos SQL.

Más allá de que se puede definir el valor de la constante DB_COLLATE durante la instalación o en el archivo wp-config.php, vamos a ver para qué se usa y cómo ajustarlo a tus propias necesidades.

collation en SQL

Como casi siempre, la mejor forma de explicar algo es con un ejemplo; la explicación en texto a veces se queda incompleta 😉.

La traducción de COLLATE o COLLATION, puedes encontrarla como «cotejamiento» o «intercalación» y, a veces, como «ordenación». Por eso lo importante es el concepto, no como se denomine.

En texto, la explicación es:

Una intercalación de MySQL es un conjunto de reglas que se utilizan para comparar caracteres en un conjunto de caracteres en particular. Cada juego de caracteres en MySQL puede tener más de una intercalación y tiene, al menos, una intercalación predeterminada. Dos conjuntos de caracteres no pueden tener la misma intercalación.

puede que sea suficiente para ti.

Vamos con el ejemplo:

DB_COLLATE en WordPress - Tabla de ejemplo
DB_COLLATE en WordPress – Tabla de ejemplo

En la tabla que usamos de ejemplo llamada «usuarios», tenemos nueve filas con el siguiente contenido, que corresponden a nuestros usuarios:

MariaDB [libreria_cf]> SELECT * FROM `usuarios` ORDER BY `ID` ASC ;
+------+---------+----------+--------+---------------+-------------+
| ID   | nombre  | apellido | genero | fecha_de_alta | pais        |
+------+---------+----------+--------+---------------+-------------+
|    1 | Rita    | Gómez    | F      | 2018-01-01    | México      |
|    2 | Paola   | López    | F      | 2018-01-01    | España      |
|    3 | Ángel   | Nieto    | M      | 2018-01-01    | España      |
|    4 | Ricardo | Ronco    | M      | 2018-01-01    | Perú        |
|    5 | Carlos  | Martín   | M      | 2018-01-01    | Puerto Rico |
|    6 | Über    | Schmidt  | M      | 2021-01-01    | Alemania    |
|    7 | Ërnst   | Lubich   | M      | 2020-01-01    | Holanda     |
|    8 | Ángela  | Gomez    | F      | 2018-01-01    | Nicaragua   |
|    9 | angela  | gómez    | F      | 2018-01-01    | México      |
+------+---------+----------+--------+---------------+-------------+
9 rows in set (0.000 sec)

MariaDB [libreria_cf]> 

En esta tabla tenemos las columnas:

  • «ID» que es un número único identificativo de la fila.
  • «nombre» que almacena el nombre propio del usuario.
  • «apellido» que almacena el apellido del usuario.
  • «genero» que almacena el genero del usuario.
  • «fecha_de_alta» donde guardamos la fecha en que el usuario se dio de alta.
  • «pais» correspondiente al país de residencia del usuario.

En esta tabla hay tres cosas a destacar:

  1. La columna «ID» tiene el nombre en mayúsculas, contrariamente al resto. No hay una razón técnica para esto, simplemente es una costumbre, el campo que será usado para establecer una relación, yo lo pongo en mayúsculas.
  2. El campo «pais» no está correctamente escrito falta la tilde, pero también por costumbre, en los nombres de los campos nunca uso caracteres que puedan resultar confusos es decir, caracteres que no formen parte de los 256 caracteres ANSI, ni espacios en blanco.
  3. Dentro del campo «nombre» nos encontramos en el registro/fila número 3, en el 6 y en el 8, un nombre de usuario con caracteres «no estándar», que es precisamente el que puede reportar problemas, dependiendo de la collation.

Una vez que sabemos con qué ejemplo vamos a trabajar, vamos con un poco de explicación en profundidad del concepto de «intercalación» en SQL.

Se trata de un patrón de bits utilizado para representar/almacenar cada carácter, y en consecuencia también se refiere a las reglas utilizadas para ordenar y comparar caracteres. Evidentemente, se trata de un concepto que afecta sólo a los campos de texto.

La intercalación por defecto, se establece en el momento de la instalación del servidor; esto no quiere decir que sea inamovible, sino que el la que se usará al momento de crear nuevas bases de datos, si no se establece específicamente.

Es importante tener en cuenta que la Intercalación (Collation) de una base de datos, sólo afecta a:

  • La Intercalación de las tablas y objetos del sistema.
  • La Intercalación de las nuevas tablas y objetos que se creen en la base de datos. Esto es debido, a que si no se especifica de forma explícita la Intercalación deseada en la sentencia CREATE correspondiente, se tomará por defecto la Intercalación de la base de datos.

Es posible cambiar la Intercalación de una base de datos utilizando el comando ALTER DATABASE COLLATE (ej: ALTER DATABASE miBaseDatos COLLATE Modern_Spanish_CI_AS). Sin embargo, lo más probable es que no consigamos lo que creemos estar consiguiendo.

El comando ALTER DATABASE COLLATE se limita a cambiar la Intercalación de las tablas del sistema de la base de datos y el valor de Intercalación que por defecto utilizarán los nuevos objetos que se creen sin especificar de forma explícita la Intercalación deseada.

Sin embargo, ALTER DATABASE COLLATE no cambiará la intercalación de las tablas existentes.

¿Y esto en qué afecta al ejemplo? Pues bien, si quieres ordenar a los usuarios por su apellido encontrarás que, dependiendo de la intercalación usada, puedes encontrar diferentes resultados.

Con la intercalación de la tabla: utf8mb4_general_ci

MariaDB [libreria_cf]> SELECT * FROM `usuarios` ORDER BY `apellido` ASC ;
+------+---------+----------+--------+---------------+-------------+
| ID   | nombre  | apellido | genero | fecha_de_alta | pais        |
+------+---------+----------+--------+---------------+-------------+
|    1 | Rita    | Gómez    | F      | 2018-01-01    | México      |
|    8 | Ángela  | Gomez    | F      | 2018-01-01    | Nicaragua   |
|    9 | angela  | gómez    | F      | 2018-01-01    | México      |
|    2 | Paola   | López    | F      | 2018-01-01    | España      |
|    7 | Ërnst   | Lubich   | M      | 2020-01-01    | Holanda     |
|    5 | Carlos  | Martín   | M      | 2018-01-01    | Puerto Rico |
|    3 | Ángel   | Nieto    | M      | 2018-01-01    | España      |
|    4 | Ricardo | Ronco    | M      | 2018-01-01    | Perú        |
|    6 | Über    | Schmidt  | M      | 2021-01-01    | Alemania    |
+------+---------+----------+--------+---------------+-------------+
9 rows in set (0.000 sec)

MariaDB [libreria_cf]> 

Con la intercalación de la tabla: binary

MariaDB [libreria_cf]> SELECT * FROM `usuarios_1` ORDER BY `apellido` ASC ;
+------+---------+----------+--------+---------------+-------------+
| ID   | nombre  | apellido | genero | fecha_de_alta | pais        |
+------+---------+----------+--------+---------------+-------------+
|    8 | Ángela  | Gomez    | F      | 2018-01-01    | Nicaragua   |
|    1 | Rita    | Gómez    | F      | 2018-01-01    | México      |
|    7 | Ërnst   | Lubich   | M      | 2020-01-01    | Holanda     |
|    2 | Paola   | López    | F      | 2018-01-01    | España      |
|    5 | Carlos  | Martín   | M      | 2018-01-01    | Puerto Rico |
|    3 | Ángel   | Nieto    | M      | 2018-01-01    | España      |
|    4 | Ricardo | Ronco    | M      | 2018-01-01    | Perú        |
|    6 | Über    | Schmidt  | M      | 2021-01-01    | Alemania    |
|    9 | angela  | gómez    | F      | 2018-01-01    | México      |
+------+---------+----------+--------+---------------+-------------+
9 rows in set (0.000 sec)

MariaDB [libreria_cf]> 

DB_COLLATE en WordPress.

Y esto se produce porque en una tabla de signos las letras mayúsculas y minúsculas tienen «el mismo peso», mientras que en otra primero se ordenan las minúsculas y luego las mayúsculas (por ejemplo).

Es posible que si tu tabla de clientes o usuarios esté compuesta por unos cincuenta registros, el tema de la ordenación no sea de gran importancia para ti. ¿Imaginas lo que puede pasar en una tabla con dos mil clientes de diferentes países?

Volviendo a WordPress

Una vez que tienes claro el concepto de la intercalación en la base de datos de tipo SQL, es hora de ver cómo funciona en WordPress.

Vamos a empezar desde el principio es decir, desde el momento de la instalación de WordPress en tu servidor.

En el momento de la instalación, WordPress no hace nada con respecto a la intercalación porque, no puede hacer nada. 😉

La base de datos la crea el servidor y es, por tanto, el responsable de indicar la ordenación a usar en la base de datos de WordPress.

Es cierto que existen varios servicios de alojamiento que ofrecen instalar WordPress con «un solo clic» y para eso, han creado sistemas automatizados que crean la base de datos e instalan WordPress en un solo paso.

Pero lo real en muchos casos (o si quieres hacer la instalación en un servidor local) es que debas crear la base de datos de forma manual en tu servidor SQL y luego introducir los datos adecuados en el archivo wp-config.php, como te comenté al principio.

Y a la pregunta de ¿Y eso en qué me afecta? puedo decirte que dependerá de lo que quieras hacer con tu WordPress aunque, es cierto que en la mayoría de los casos no afecta mucho.

Si tu servidor está en España, tu WordPress es la versión en español, tu negocio está en España y tus clientes son españoles, es bastante probable que las opciones por defecto te sean suficientes y adecuadas (puedes sustituir España por «Yupistán» y aplicar la misma regla 😊).

Yo recomiendo (si no quieres usar el valor por defecto) un collate de utf8mb4 por su versatilidad, ya que es válido para una gran amplitud de lenguajes, incluyendo emojis.

Por defecto, WordPress usará esta intercalación a partir de la versión 4.2. Es más, durante la actualización de versiones anteriores, se forzó el cambio a ese nuevo estándar, siempre que se cumplen las condiciones:

  • La tabla usa el charset utf8
  • El servidor SQL esta corriendo MySQL versión 5.5.2 o superior, o MariaDB versión 10 o superior.
  • Las librerías del cliente SQL son versión 5.5.3 o superior.

En palabras «oficiales» de WordPress:

«La diferencia entre utf8 y utf8mb4 es que la primera sólo puede almacenar hasta 3 bytes por carácter, mientras que la última puede almacenar 4 bytes por carácter. En términos de Unicode, utf8 sólo puede almacenar caracteres en el plano Básico Multinacional, mientras que utf8mb4 puede almacenar cualquier caracter Unicode. Esto expande enormemente la usabilidad de WordPress, especialmente en paises que usan el conjunto de caracteres Han. Unicode no está libre de problemas, pero es la mejor opción disponible.»

utf8mb4 es 100% compatible con utf8.

El coste en rendimiento

Usar un collate no adecuado no representa coste alguno en cuanto a rendimiento del servidor, pero hay algunos juegos de caracteres que necesitan un mayor número de bytes para ser almacenados.

Usar la ordenación con utf8 es normalmente suficiente y adecuado para cualquier lenguaje occidental, pero si usas caracteres de alguna lengua oriental como el Hindi, necesitarás más capacidad de almacenamiento para el tratamiento de los caracteres (3 o 4 bytes); igual si haces uso de muchos emoji en tus entradas.

Este uso extra, se verá reflejado en la longitud de las cadenas (para almacenar un nombre como María en su equivalente, necesitarás una cadena de 15 o 20 bytes).

DB_COLLATE en WordPress.

¿Qué se puede hacer?

Te sugiero que en el momento de crear la base de datos, te asegures de que la creación se realice con los parámetros adecuados, por ejemplo:

  CREATE DATABASE miDBdeWP COLLATE = 'utf8mb4_general_ci';

La intercalación utf8mb4 usa hasta 4 bytes para cada carácter.

Pero una vez que se ha establecido la intercalación en el momento de crear la base de datos, ¿qué se puede hacer?

Puedes probar con, por ejemplo:

  ALTER DATABASE miDBdeWP COLLATE = 'utf8mb4_general_ci';

Ten en cuenta que si ya se han creado tablas dentro de la base de datos, estas NO se verán afectadas por el comando ALTER.

Si ya está creada la base de datos y te preparas a instalar WordPress, asegúrate de que en el archivo wp-config.php se especifique;

  define('DB_CHARSET', 'utf8mb4');
y / o
  define('DB_COLLATE', 'utf8mb4_general_ci');

Con esto te aseguras de que las tablas que se creen a continuación, usarán tus indicaciones.

Siempre, siempre, haz una copia de respaldo antes de tocar cualquier cosa de la base de datos. Recuerda que un «pequeño error» puede dar al traste con todo tu sitio, de forma irrecuperable (si no tienes copia).

Conclusión

Recuerdo que en mis años escolares, me repetían siempre, «El saber no ocupa lugar» y, más allá de posibles bromas al respecto, siempre pienso que aunque no lo necesites ahora mismo, siempre es conveniente tener el conocimiento.

Quizá este tema no te interesa o «no te importa», pero ahora sabes algo sobre esto y no te sonará «a marciano» si tienes que tratarlo.

La configuración por defecto es probable que sea suficiente para ti … ¡me alegro!

Si te manejas con el inglés, puedes leer una publicación oficial de WordPress, en la que desaconsejan jugar con los valores que aquí te comento, el artículo se llama: Converting Database Character Sets.

Mientras tanto, recuerda, #UsaMascarilla, #LavateLasManos, juega, experimenta y, sobre todo, ¡divertirte!


¡Gracias por leernos!


¡Tus comentarios y preguntas nos ayudan a mejorar, por favor comenta!


  1. Content Management System – Sistema de Gestión de Contenidos 

  2. Structured Query Language – Lenguaje de Búsqueda Estructurado 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

4 × 5 =

Para ofrecer las mejores experiencias, utilizamos tecnologías como las cookies para almacenar y/o acceder a la información del dispositivo. El consentimiento de estas tecnologías nos permitirá procesar datos como el comportamiento de navegación o las identificaciones únicas en este sitio. No consentir o retirar el consentimiento, puede afectar negativamente a ciertas características y funciones.    Más información
Privacidad