WPML

¿Qué son los conjuntos de caracteres y las intercalaciones en MySQL?

Cuando WordPress almacena el contenido de su sitio en la base de datos (como entradas, títulos, cadenas traducidas, etc.), utiliza un conjunto de caracteres para representar los caracteres y una intercalación para definir cómo se comparan y ordenan esos caracteres.

Conjunto de caracteres (Charset)
Define cómo se almacenan los caracteres en la base de datos (esencialmente, qué bytes representan qué caracteres).
Intercalación
Define las reglas para comparar esos caracteres (por ejemplo, distinción entre mayúsculas y minúsculas, distinción de acentos y orden de clasificación).

Por qué es importante para los sitios multilingües

WPML es compatible con contenido multilingüe, que a menudo incluye:

  • Caracteres especiales (por ejemplo, ñ, é, ö)
  • Alfabetos no latinos (por ejemplo, árabe, japonés, chino, hebreo)
  • Emojis y símbolos (🎉, ✔️, etc.)

Muchos de estos requieren más de 3 bytes para almacenarse correctamente. Si su base de datos utiliza una intercalación incompatible, los caracteres pueden perderse, reemplazarse por o generar errores de base de datos (por ejemplo, “Incorrect string value”).

Por eso recomendamos encarecidamente utilizar una intercalación que admita caracteres Unicode de 4 bytes.

Nuestra recomendación

Utilice el conjunto de caracteres utf8mb4 y una intercalación compatible con Unicode, como:

  • utf8mb4_unicode_ci: ampliamente compatible, buen valor predeterminado
  • utf8mb4_unicode_520_ci: mejor manejo de Unicode en MySQL 5.6 o superior
  • utf8mb4_general_ci: ligeramente más rápido, comparación Unicode menos precisa
  • utf8mb4_bin: distingue entre mayúsculas, minúsculas y acentos (comparación binaria)

Todos estos son seguros de usar con WPML.


Importante: El antiguo conjunto de caracteres utf8 en MySQL solo admite hasta 3 bytes por carácter. No puede manejar algunos caracteres como emojis o algunos ideogramas. Evite usarlo para contenido multilingüe.

¿Cuál es el valor predeterminado en MySQL?

Versión de MySQLCharset predeterminadoIntercalación predeterminadaCompatible con Unicode
< 5.5latin1latin1_swedish_ciNo
5.5.xutf8utf8_general_ciNo
5.7+utf8mb4utf8mb4_general_ci / utf8mb4_unicode_ci
8.0+utf8mb4utf8mb4_0900_ai_ci

WordPress no siempre sigue el valor predeterminado de MySQL: puede anularlo mediante configuración o migraciones.

Configurar el conjunto de caracteres y la intercalación para sitios nuevos

Para asegurarse de que WordPress cree nuevas tablas con el conjunto de caracteres y la intercalación correctos, defina lo siguiente en su archivo wp-config.php:

define( 'DB_CHARSET', 'utf8mb4' ); // If you have utf8 that's fine, WP will automatically map it as utf8mb4
define( 'DB_COLLATE', 'utf8mb4_unicode_ci' );

Esto se aplicará a las nuevas instalaciones y a las tablas recién creadas.

Comprobar el conjunto de caracteres y la intercalación en sitios y tablas existentes

A continuación, le explicamos cómo comprobar el conjunto de caracteres y la intercalación en sus sitios existentes.

Opción 1 phpMyAdmin

  1. Vaya a la base de datos de su sitio.
  2. Compruebe la columna «Intercalación» junto a cada tabla.
  3. Haga clic en una tabla para ver la intercalación individual de cada columna.

Opción 2 WP-CLI

bash

wp db query "SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.tables WHERE table_schema = 'your_db_name';"

También puede inspeccionar columnas individuales:

bash

wp db query "SHOW FULL COLUMNS FROM wp_posts;"

Si ve que la intercalación comienza con utf8mb4_, entonces está lista para admitir todo tipo de caracteres Unicode e ideogramas de 4 bytes. El conjunto de caracteres también es correcto.

Si ve otra cosa, por ejemplo utf8_*, entonces necesita cambiarla.

Tenga en cuenta que la intercalación puede ser diferente para cada columna.

Actualizar el conjunto de caracteres y la intercalación para tablas y columnas existentes

La actualización de las constantes DB_CHARSET y DB_COLLATE en su archivo wp-config.php solo afecta a las tablas nuevas. Para aplicar los cambios a las tablas y columnas existentes, debe convertirlas manualmente mediante SQL.

También recomendamos actualizar la intercalación de MySQL predeterminada de la base de datos con el siguiente comando:

ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Comience siempre con una copia de seguridad

Antes de ejecutar cualquier consulta de conversión:

  • Exporte su base de datos usando phpMyAdmin o mysqldump
  • Guárdela en un lugar seguro por si algo sale mal

Advertencia: las actualizaciones de intercalación pueden fallar en modo estricto

Al actualizar la intercalación de una tabla entera (o base de datos), MySQL puede reconstruir las tablas y revalidar todos los valores predeterminados de las columnas, incluidos los no relacionados como DATETIME. Si su base de datos se ejecuta en modo SQL estricto (STRICT_TRANS_TABLES, NO_ZERO_DATE), las columnas con valores predeterminados como '0000-00-00 00:00:00' generarán errores como:

#1067 - Invalid default value.

¿Qué es el modo estricto?

El modo estricto controla cómo MySQL maneja los valores no válidos o ausentes al añadir o actualizar datos en la base de datos. Un valor puede no ser válido por varias razones. Por ejemplo, podría tener el tipo de datos incorrecto para la columna o podría estar fuera de rango.

Puede encontrar información sobre los diferentes tipos de validación de datos para el modo estricto en la documentación de MySQL.

Cómo afecta el modo estricto a la base de datos de un sitio web de WordPress

De forma predeterminada, WordPress utiliza '0000-00-00 00:00:00' como valor predeterminado para algunas columnas datetime, lo cual no es aceptado por el modo estricto NO_ZERO_DATE.

Tenga en cuenta que estos valores predeterminados se permitieron durante la creación original de la tabla (por ejemplo, durante la configuración de WordPress), pero fallan en las operaciones ALTER en entornos estrictos.

Cómo comprobar si el modo estricto está activado

Ejecute el siguiente comando:

SELECT @@SESSION.sql_mode, @@GLOBAL.sql_mode;

Busque:

  • STRICT_TRANS_TABLES
  • STRICT_ALL_TABLES
  • NO_ZERO_DATE

Si encuentra alguno de estos, el modo estricto está activado.

Para evitar errores durante las actualizaciones del conjunto de caracteres y la intercalación, solo necesita desactivar el modo estricto NO_ZERO_DATE.

Cómo proceder de forma segura

Haga una de las siguientes acciones para proceder de forma segura:

1. Evite alterar columnas y tablas a menos que la intercalación realmente necesite cambiarse.

2. Desactive temporalmente el modo estricto solo para la sesión mientras ejecuta las consultas de conversión. Puede hacerlo con el siguiente comando:

SET SESSION sql_mode = REPLACE(@@sql_mode, 'NO_ZERO_DATE', '');

Nota: existen planes futuros para que MySQL fusione los modos estrictos.

En caso de otros problemas particulares de sus datos, es posible que desee desactivar cualquier modo estricto mediante el siguiente comando:

SET SESSION sql_mode = '';

Consultas para convertir datos

Convertir toda la base de datos

Lo siguiente genera una consulta ALTER TABLE para cada tabla de su base de datos:

SELECT CONCAT(
  'ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'
) AS query
  FROM INFORMATION_SCHEMA.TABLES
  WHERE TABLE_SCHEMA = 'your_database_name';

Ejecute las consultas resultantes en phpMyAdmin, o cópielas y péguelas en MySQL CLI / WP-CLI.

Esto garantiza que todas las tablas de su base de datos adopten el nuevo conjunto de caracteres y la intercalación.

Convertir una tabla específica Opcional/Accesorio
ALTER TABLE wp_posts 
  CONVERT TO CHARACTER SET utf8mb4 
  COLLATE utf8mb4_unicode_ci;

Esto actualiza todas las columnas de texto en la tabla wp_posts para usar utf8mb4 y la intercalación especificada.


Convertir una columna específica Opcional/Accesorio
ALTER TABLE wp_posts 
  CHANGE post_title post_title TEXT 
  CHARACTER SET utf8mb4 
  COLLATE utf8mb4_unicode_ci;

Nota:

  • Debe volver a declarar completamente la columna (tipo, nombre) en CHANGE.
  • Asegúrese de que el tipo de columna coincida con el existente.

Errores comunes al convertir

A continuación, se muestran dos errores comunes que puede encontrar al convertir tablas y columnas.

Conjunto de caracteres e intercalación no coincidentes
-- INVALID: utf8 collation with utf8mb4 charset
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_general_ci;
-- Error: COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'

Solución:

  • Utilice una intercalación coincidente: utf8mb4_*

Límite de longitud de la clave de índice
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

En algunas configuraciones, especialmente para las versiones de MySQL anteriores a la 5.7, se puede superar la longitud máxima de la clave de índice al añadir un byte más por carácter.

Solución:

  • Acorte el VARCHAR(255) indexado a VARCHAR(191) si es necesario
  • O actualice a MySQL 5.7 o superior y asegúrese de que innodb_large_prefix esté activado

Resumen

  • Utilice el conjunto de caracteres utf8mb4 para una compatibilidad total con Unicode
  • Utilice intercalaciones compatibles: utf8mb4_unicode_ci, utf8mb4_0900_ai_ci, etc.
  • Actualice wp-config.php para las tablas nuevas
  • Ejecute migraciones SQL para corregir las tablas existentes
  • Nunca mezcle conjuntos de caracteres e intercalaciones: MySQL los rechazará o los romperá.