Guía para cambiar el conjunto de caracteres de MySQL: Convertir a utf8mb4 (corregir Mojibake)

目次

1. Introducción

Por qué puede ser necesario cambiar el conjunto de caracteres de MySQL

Un conjunto de caracteres de base de datos es una configuración importante que determina cómo se codifica y procesa el texto para su almacenamiento. En MySQL, el conjunto de caracteres predeterminado suele ser latin1, lo que puede causar problemas al trabajar con japonés u otros caracteres especiales. Especialmente durante la migración de datos o la estandarización del sistema, cambiar a un conjunto de caracteres adecuado se vuelve esencial.

Problemas comunes y sus causas

Los problemas típicos relacionados con los conjuntos de caracteres de MySQL incluyen lo siguiente.

  1. Mojibake (caracteres distorsionados)
  • utf8 y latin1 están mezclados en el mismo entorno
  • La configuración del conjunto de caracteres del cliente y del servidor no coinciden
  1. Problemas al buscar
  • Debido a diferencias de intercalación, no se devuelven los resultados de búsqueda esperados
  • El orden de clasificación difiere de lo que se espera
  1. Problemas durante la migración de datos
  • Los emojis y símbolos especiales no pueden guardarse porque no se usa utf8mb4
  • La conversión de conjuntos de caracteres no se maneja correctamente durante la exportación/importación

Objetivos y estructura del artículo

Este artículo ofrece una explicación completa sobre los cambios de conjunto de caracteres en MySQL, desde conceptos fundamentales hasta cómo cambiar la configuración y solución de problemas.

Esquema

  1. Conocimientos básicos de los conjuntos de caracteres de MySQL
  2. Cómo comprobar el conjunto de caracteres actual
  3. Cómo cambiar el conjunto de caracteres de MySQL
  4. Solución de problemas después del cambio
  5. Cómo los cambios de conjunto de caracteres afectan el rendimiento
  6. Configuraciones recomendadas (mejores prácticas)
  7. Preguntas frecuentes (FAQ)

Al leer esta guía, profundizarás tu comprensión de los conjuntos de caracteres de MySQL y podrás elegir la configuración adecuada y evitar problemas comunes.

2. ¿Qué es un conjunto de caracteres de MySQL? Entendiendo los conceptos básicos

¿Qué es un conjunto de caracteres?

Un conjunto de caracteres (Character Set) es un conjunto de reglas utilizado para almacenar y procesar caracteres como datos digitales. Por ejemplo, al almacenar el carácter japonés “あ”, UTF-8 lo representa como la secuencia de bytes E3 81 82, mientras que Shift_JIS usa 82 A0.

En MySQL, puedes especificar diferentes conjuntos de caracteres a nivel de base de datos o de tabla. Al elegir un conjunto de caracteres apropiado, puedes evitar mojibake y facilitar la internacionalización.

Conjuntos de caracteres comunes

Character SetCharacteristicsUse Case
utf8UTF-8 up to 3 bytesDoes not support some special characters (such as emoji)
utf8mb4UTF-8 up to 4 bytesSupports emoji and special characters (recommended)
latin1ASCII-compatibleUsed in older systems

¿Qué es la intercalación?

La intercalación es el conjunto de reglas usado para comparar y ordenar datos dentro de un conjunto de caracteres. Por ejemplo, define si “A” y “a” se tratan como el mismo carácter y cómo se determina el orden.

Intercalaciones de uso frecuente

CollationDescription
utf8_general_ciCase-insensitive, suitable for general use
utf8_unicode_ciUnicode-based collation (recommended)
utf8mb4_binBinary comparison (use when exact matches are required)

Diferencias entre utf8 y utf8mb4

El utf8 de MySQL en realidad solo puede almacenar hasta 3 bytes por carácter, por lo que no puede manejar ciertos caracteres especiales (como emojis o algunos caracteres CJK extendidos). En contraste, utf8mb4 admite hasta 4 bytes por carácter, razón por la cual se recomienda que las aplicaciones modernas usen utf8mb4.

Character SetMax BytesEmoji SupportRecommendation
utf83 bytes❌ Not supported❌ Not recommended
utf8mb44 bytes✅ Supported✅ Recommended

Por qué deberías cambiar de utf8 a utf8mb4

  1. Compatibilidad futura: Los sistemas modernos están estandarizando cada vez más en utf8mb4.
  2. Almacenamiento de caracteres especiales y emojis: Con utf8mb4 puedes manejar de forma segura datos en publicaciones de redes sociales y aplicaciones de mensajería.
  3. Internacionalización: Para sistemas multilingües, reduce el riesgo de mojibake.

Resumen

  • Conjunto de caracteres determina cómo se almacenan y procesan los datos.
  • Intercalación determina cómo se comparan los caracteres.
  • El utf8 de MySQL está limitado a 3 bytes, por lo que se recomienda utf8mb4.
  • utf8mb4_unicode_ci es una intercalación comúnmente recomendada para uso general.

3. Cómo comprobar el conjunto de caracteres actual

Antes de cambiar el conjunto de caracteres de MySQL, es importante verificar la configuración actual.
Dado que los conjuntos de caracteres pueden establecerse en varios niveles (base de datos, tabla, columna), debes entender exactamente dónde se requieren los cambios.

Cómo comprobar el conjunto de caracteres actual

Comprobar el conjunto de caracteres a nivel del servidor MySQL

Primero, verifica la configuración del conjunto de caracteres y la intercalación predeterminados para todo el servidor MySQL.

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

Salida de ejemplo:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                        |
+--------------------------+----------------------------+

Comprobar el conjunto de caracteres por base de datos

Para comprobar el conjunto de caracteres de una base de datos específica, utiliza la siguiente consulta.

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'database_name';

Salida de ejemplo

+----------------+----------------------+----------------------+
| SCHEMA_NAME    | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------+----------------------+----------------------+
| my_database   | utf8mb4               | utf8mb4_unicode_ci   |
+----------------+----------------------+----------------------+

Comprobar el conjunto de caracteres de una tabla

Así es como se verifica el conjunto de caracteres de una tabla específica.

SHOW CREATE TABLE table_name;

Salida de ejemplo

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

Puntos de control

  • DEFAULT CHARSET=latin1 → No es utf8mb4, por lo que se necesita un cambio
  • COLLATE=latin1_swedish_ci → Cambiar a utf8mb4_unicode_ci suele ser más apropiado

Comprobar el conjunto de caracteres de una columna

Para inspeccionar el conjunto de caracteres a nivel de columna, ejecuta el siguiente SQL.

SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'database_name' 
AND TABLE_NAME = 'table_name';

Salida de ejemplo

+-------------+--------------------+----------------------+
| COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME       |
+-------------+--------------------+----------------------+
| name        | latin1             | latin1_swedish_ci    |
| email       | utf8mb4            | utf8mb4_unicode_ci   |
+-------------+--------------------+----------------------+

En este ejemplo, la columna name usa latin1, por lo que se recomienda cambiarla a utf8mb4.

Resumen

  • Los conjuntos de caracteres de MySQL se configuran en varios niveles (servidor, base de datos, tabla, columna).
  • Al comprobar el conjunto de caracteres en cada nivel, puedes aplicar los cambios correctos.
  • Utiliza comandos como SHOW VARIABLES y SHOW CREATE TABLE para comprender completamente la configuración actual.

4. Cómo cambiar el conjunto de caracteres de MySQL

Al cambiar adecuadamente el conjunto de caracteres de MySQL, puedes evitar el mojibake y soportar datos multilingües de forma más fluida.
En esta sección, explicamos cómo actualizar la configuración en cada nivel: a nivel de servidor, base de datos, tabla y columna.

Cambiar el conjunto de caracteres predeterminado a nivel de servidor

Para cambiar el conjunto de caracteres predeterminado a nivel de servidor, necesitas editar el archivo de configuración de MySQL (my.cnf o my.ini).

Pasos

  1. Abrir el archivo de configuración
  • En Linux: bash sudo nano /etc/mysql/my.cnf
  • En Windows: wp:list /wp:list

    • Abrir C:\ProgramData\MySQL\MySQL Server X.X\my.ini
  1. Agregar o cambiar la configuración del conjunto de caracteres Agrega o actualiza las siguientes líneas bajo la sección mysqld.
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    
  1. Reiniciar MySQL
    sudo systemctl restart mysql
    

En Windows:

net stop MySQL && net start MySQL
  1. Verificar el cambio
    SHOW VARIABLES LIKE 'character_set_server';
    

Cambiar el conjunto de caracteres a nivel de base de datos

ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Verificar el cambio

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME 
FROM information_schema.SCHEMATA 
WHERE SCHEMA_NAME = 'mydatabase';

Cambiar el conjunto de caracteres a nivel de tabla

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Verificar el cambio

SHOW CREATE TABLE users;

Cambiar el conjunto de caracteres a nivel de columna

ALTER TABLE users MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Verificar el cambio

SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'mydatabase' 
AND TABLE_NAME = 'users';

Verificación posterior al cambio y la importancia de las copias de seguridad

Para preservar la integridad de los datos después de cambiar el conjunto de caracteres, siga estos pasos.

Haga una copia de seguridad de sus datos

mysqldump -u root -p --default-character-set=utf8mb4 mydatabase > backup.sql

Vuelva a comprobar la configuración

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SHOW CREATE TABLE users;

Inserte y muestre datos de prueba

INSERT INTO users (name, email) VALUES ('Test User', 'test@example.com');
SELECT * FROM users;

Resumen

  • Cambio del conjunto de caracteres a nivel de servidor : Edite my.cnf y establezca character-set-server=utf8mb4
  • Cambio del conjunto de caracteres de la base de datos : ALTER DATABASE mydatabase CHARACTER SET utf8mb4
  • Cambio del conjunto de caracteres de la tabla : ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4
  • Cambio del conjunto de caracteres de la columna : ALTER TABLE users MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4
  • Después de los cambios, siempre verifique la configuración y pruebe sus datos

5. Solución de problemas después de cambiar el conjunto de caracteres

Después de cambiar el conjunto de caracteres de MySQL, puede encontrarse con casos en los que el sistema no funciona correctamente o los datos almacenados se corrompen.
En esta sección, explicamos en detalle problemas comunes y cómo solucionarlos.

Causas del mojibake y cómo solucionarlo

Si ocurre mojibake después de cambiar el conjunto de caracteres, las siguientes causas son comunes.

CauseHow to CheckSolution
The client character set setting differsSHOW VARIABLES LIKE 'character_set_client';Run SET NAMES utf8mb4;
Existing data was stored using a different encodingSELECT HEX(column_name) FROM table_name;Use CONVERT() or re-export the data
The connection encoding is not correctConnect with mysql --default-character-set=utf8mb4Adjust the client-side character set configuration
Application settings (PHP/Python, etc.) are incorrectmysqli_set_charset($conn, 'utf8mb4');Standardize the application’s character set settings

Solución #1: Configurar correctamente el conjunto de caracteres del cliente

SET NAMES utf8mb4;

Solución #2: Convertir los datos existentes correctamente

UPDATE users SET name = CONVERT(CAST(CONVERT(name USING latin1) AS BINARY) USING utf8mb4);

Notas al convertir de latin1 a utf8mb4

Procedimiento seguro

  1. Hacer una copia de seguridad de los datos actuales
    mysqldump -u root -p --default-character-set=latin1 mydatabase > backup.sql
    
  1. Cambiar el conjunto de caracteres de la base de datos
    ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  1. Cambiar el conjunto de caracteres de la tabla
    ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  1. Reimportar los datos
    mysql -u root -p --default-character-set=utf8mb4 mydatabase < backup.sql
    

Los datos no son buscables después del cambio

Caso #1: La búsqueda con LIKE no funciona

SELECT * FROM users WHERE name COLLATE utf8mb4_unicode_ci LIKE '%Tanaka%';

Caso #2: El orden de clasificación cambió

SELECT * FROM users ORDER BY BINARY name;

Medidas del lado de la aplicación

Para PHP

mysqli_set_charset($conn, 'utf8mb4');

Para Python (MySQL Connector)

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="mydatabase",
    charset="utf8mb4"
)

For Node.js (MySQL2)

const mysql = require('mysql2');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'mydatabase',
  charset: 'utf8mb4'
});

Summary

  • Post-change issues generally fall into three categories: client settings, data conversion, and application settings.
  • To prevent mojibake, standardize the client character set using SET NAMES utf8mb4.
  • Watch for LIKE search and sort order changes, and specify COLLATE when needed.
  • Set utf8mb4 in your application as well to avoid encoding mismatches.

6. How Character Set Changes Affect Performance

When changing the MySQL character set to utf8mb4, there are several performance considerations, such as increased storage usage and index limitations.
In this section, we explain the impact and the best countermeasures.

Increased Storage Usage

Compared to MySQL’s utf8, utf8mb4 can use up to 4 bytes per character,
so the overall table size may increase.

Max bytes per character by character set

Character SetMax Bytes per Character
latin11 byte
utf83 bytes
utf8mb44 bytes

For example, with utf8, VARCHAR(255) is up to 765 bytes (255×3),
but with utf8mb4, it becomes up to 1020 bytes (255×4).

Countermeasure

ALTER TABLE posts MODIFY COLUMN title VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Increased Index Size

MySQL enforces a maximum index key length.
After switching to utf8mb4, index entries become larger, and you may hit the limit—making indexes unusable.

Check index impact

SHOW INDEX FROM users;

Example error

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

Countermeasure

ALTER TABLE users MODIFY COLUMN email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Impact on Query Performance

Changing the character set to utf8mb4 may affect query execution speed.

Operations that may be affected

  • LIKE searches over large datasets
  • ORDER BY processing
  • JOIN query performance

Countermeasure

CREATE INDEX idx_name ON users(name(100));

Memory Usage and Buffer Tuning

With utf8mb4, memory usage may increase.

Recommended settings

[mysqld]
innodb_buffer_pool_size = 1G
query_cache_size = 128M

Summary

  • Switching to utf8mb4 increases storage usage.
  • Index sizes increase and may exceed limits.
  • Query performance can be affected.
  • Because memory usage may increase, buffer sizes may need tuning.

7. Recommended Settings (Best Practices)

By setting MySQL character sets appropriately, you can maintain data integrity while optimizing performance.
In this section, we present recommended MySQL character set configurations and explain key points for an optimal setup.

Recommended MySQL Character Set Configuration

ItemRecommended SettingReason
Character Setutf8mb4Supports all Unicode characters including emoji and special characters
Collationutf8mb4_unicode_ciCase-insensitive and suitable for multilingual systems
Storage EngineInnoDBGood balance of performance and consistency
Indexed string lengthVARCHAR(191)Avoids exceeding MySQL index limits

Recommended my.cnf Settings

1. MySQL Server Character Set Settings

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
skip-character-set-client-handshake
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_buffer_pool_size = 1G
query_cache_size = 128M

2. Client-Side Character Set Settings

[client]
default-character-set = utf8mb4

Recommended Database Settings

CREATE DATABASE mydatabase DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

To change an existing database character set:

ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Recommended Table Settings

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
  email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Cambiar el conjunto de caracteres de tablas existentes

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Diferencias entre utf8mb4_general_ci y utf8mb4_unicode_ci

CollationCharacteristicsUse Case
utf8mb4_general_ciFaster comparisons, but less accuratePerformance-focused systems
utf8mb4_unicode_ciUnicode-standard, more accurate comparisonsGeneral-purpose use (recommended)

Si necesitas soporte multilingüe o una ordenación precisa, elige utf8mb4_unicode_ci.

Optimización de índices

CREATE FULLTEXT INDEX idx_fulltext ON articles(content);

Resumen

  • La combinación de utf8mb4 + utf8mb4_unicode_ci es recomendada.
  • Estandariza la configuración del servidor (my.cnf) y los conjuntos de caracteres de conexión.
  • Especifica explícitamente utf8mb4 a nivel de base de datos, tabla y columna.
  • Utiliza VARCHAR(191) para evitar limitaciones de longitud de clave de índice.
  • Usa utf8mb4_unicode_ci para comparaciones precisas.

8. Preguntas frecuentes

Aquí tienes preguntas comunes del mundo real sobre cómo cambiar los conjuntos de caracteres de MySQL.
También cubrimos cómo manejar errores y cómo elegir la mejor configuración.

¿Cuál es la diferencia entre utf8 y utf8mb4?

SHOW VARIABLES LIKE 'character_set_server';

¿Cambiar el conjunto de caracteres de MySQL provocará pérdida de datos?

mysqldump -u root -p --default-character-set=utf8mb4 mydatabase > backup.sql

¿Cómo corrijo el mojibake si ocurre?

UPDATE users SET name = CONVERT(CAST(CONVERT(name USING latin1) AS BINARY) USING utf8mb4);

¿Cuáles son los riesgos al convertir de latin1 a utf8mb4?

ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

¿Cambiar a utf8mb4 afecta el rendimiento?

ALTER TABLE users MODIFY COLUMN email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

¿Cuál debería usar: utf8mb4_general_ci o utf8mb4_unicode_ci?

CollationCharacteristicsUse Case
utf8mb4_general_ciFaster comparisons, but less accuratePerformance-focused systems
utf8mb4_unicode_ciUnicode-standard, accurate comparisonsGeneral-purpose use (recommended)

¿Las consultas se volverán más lentas después de cambiar a utf8mb4?

CREATE FULLTEXT INDEX idx_fulltext ON articles(content);

Resumen

Se recomienda utf8mb4. utf8 no se recomienda debido a sus limitaciones.
Antes de hacer cambios, siempre verifica la configuración con SHOW VARIABLES.
Utiliza flujos de trabajo de exportación/importación para prevenir el mojibake.
Considera las limitaciones de índices y usa VARCHAR(191) donde sea apropiado.
Para el rendimiento, agrega índices adecuados.

Notas finales

Cambiar el conjunto de caracteres de MySQL no es solo un ajuste de configuración simple; es una tarea crítica que puede afectar la integridad de los datos y el rendimiento.
Siguiendo la configuración y los procedimientos correctos, puedes migrar a utf8mb4 de forma segura y eficaz.

🔹 ¡Sigue los pasos de este artículo y configura tu conjunto de caracteres correctamente! 🔹