¿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 MySQL | Charset predeterminado | Intercalación predeterminada | Compatible con Unicode |
|---|---|---|---|
| < 5.5 | latin1 | latin1_swedish_ci | No |
| 5.5.x | utf8 | utf8_general_ci | No |
| 5.7+ | utf8mb4 | utf8mb4_general_ci / utf8mb4_unicode_ci | Sí |
| 8.0+ | utf8mb4 | utf8mb4_0900_ai_ci | Sí |
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
- Vaya a la base de datos de su sitio.
- Compruebe la columna «Intercalación» junto a cada tabla.
- 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á.