- 1 1. Introducción
- 2 2. ¿Qué es un conjunto de caracteres de MySQL? Entendiendo los conceptos básicos
- 3 3. Cómo comprobar el conjunto de caracteres actual
- 4 4. Cómo cambiar el conjunto de caracteres de MySQL
- 4.1 Cambiar el conjunto de caracteres predeterminado a nivel de servidor
- 4.2 Cambiar el conjunto de caracteres a nivel de base de datos
- 4.3 Cambiar el conjunto de caracteres a nivel de tabla
- 4.4 Cambiar el conjunto de caracteres a nivel de columna
- 4.5 Verificación posterior al cambio y la importancia de las copias de seguridad
- 4.6 Resumen
- 5 5. Solución de problemas después de cambiar el conjunto de caracteres
- 6 6. How Character Set Changes Affect Performance
- 7 7. Recommended Settings (Best Practices)
- 7.1 Recommended MySQL Character Set Configuration
- 7.2 Recommended my.cnf Settings
- 7.3 Recommended Database Settings
- 7.4 Recommended Table Settings
- 7.5 Cambiar el conjunto de caracteres de tablas existentes
- 7.6 Diferencias entre utf8mb4_general_ci y utf8mb4_unicode_ci
- 7.7 Optimización de índices
- 7.8 Resumen
- 8 8. Preguntas frecuentes
- 8.1 ¿Cuál es la diferencia entre utf8 y utf8mb4?
- 8.2 ¿Cambiar el conjunto de caracteres de MySQL provocará pérdida de datos?
- 8.3 ¿Cómo corrijo el mojibake si ocurre?
- 8.4 ¿Cuáles son los riesgos al convertir de latin1 a utf8mb4?
- 8.5 ¿Cambiar a utf8mb4 afecta el rendimiento?
- 8.6 ¿Cuál debería usar: utf8mb4_general_ci o utf8mb4_unicode_ci?
- 8.7 ¿Las consultas se volverán más lentas después de cambiar a utf8mb4?
- 8.8 Resumen
- 8.9 Notas finales
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.
- Mojibake (caracteres distorsionados)
utf8ylatin1están mezclados en el mismo entorno- La configuración del conjunto de caracteres del cliente y del servidor no coinciden
- 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
- 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
- Conocimientos básicos de los conjuntos de caracteres de MySQL
- Cómo comprobar el conjunto de caracteres actual
- Cómo cambiar el conjunto de caracteres de MySQL
- Solución de problemas después del cambio
- Cómo los cambios de conjunto de caracteres afectan el rendimiento
- Configuraciones recomendadas (mejores prácticas)
- 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 Set | Characteristics | Use Case |
|---|---|---|
utf8 | UTF-8 up to 3 bytes | Does not support some special characters (such as emoji) |
utf8mb4 | UTF-8 up to 4 bytes | Supports emoji and special characters (recommended) |
latin1 | ASCII-compatible | Used 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
| Collation | Description |
|---|---|
utf8_general_ci | Case-insensitive, suitable for general use |
utf8_unicode_ci | Unicode-based collation (recommended) |
utf8mb4_bin | Binary 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 Set | Max Bytes | Emoji Support | Recommendation |
|---|---|---|---|
utf8 | 3 bytes | ❌ Not supported | ❌ Not recommended |
utf8mb4 | 4 bytes | ✅ Supported | ✅ Recommended |
Por qué deberías cambiar de utf8 a utf8mb4
- Compatibilidad futura: Los sistemas modernos están estandarizando cada vez más en
utf8mb4. - Almacenamiento de caracteres especiales y emojis: Con
utf8mb4puedes manejar de forma segura datos en publicaciones de redes sociales y aplicaciones de mensajería. - 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
utf8de MySQL está limitado a 3 bytes, por lo que se recomiendautf8mb4. utf8mb4_unicode_cies 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 esutf8mb4, por lo que se necesita un cambioCOLLATE=latin1_swedish_ci→ Cambiar autf8mb4_unicode_cisuele 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 VARIABLESySHOW CREATE TABLEpara 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
- 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
- Abrir
- 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
- Reiniciar MySQL
sudo systemctl restart mysql
En Windows:
net stop MySQL && net start MySQL
- 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.cnfy establezcacharacter-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.
| Cause | How to Check | Solution |
|---|---|---|
| The client character set setting differs | SHOW VARIABLES LIKE 'character_set_client'; | Run SET NAMES utf8mb4; |
| Existing data was stored using a different encoding | SELECT HEX(column_name) FROM table_name; | Use CONVERT() or re-export the data |
| The connection encoding is not correct | Connect with mysql --default-character-set=utf8mb4 | Adjust the client-side character set configuration |
| Application settings (PHP/Python, etc.) are incorrect | mysqli_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
- Hacer una copia de seguridad de los datos actuales
mysqldump -u root -p --default-character-set=latin1 mydatabase > backup.sql
- Cambiar el conjunto de caracteres de la base de datos
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- Cambiar el conjunto de caracteres de la tabla
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 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
COLLATEwhen needed. - Set
utf8mb4in 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 Set | Max Bytes per Character |
|---|---|
latin1 | 1 byte |
utf8 | 3 bytes |
utf8mb4 | 4 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
LIKEsearches over large datasetsORDER BYprocessing- 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
utf8mb4increases 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
| Item | Recommended Setting | Reason |
|---|---|---|
| Character Set | utf8mb4 | Supports all Unicode characters including emoji and special characters |
| Collation | utf8mb4_unicode_ci | Case-insensitive and suitable for multilingual systems |
| Storage Engine | InnoDB | Good balance of performance and consistency |
| Indexed string length | VARCHAR(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
| Collation | Characteristics | Use Case |
|---|---|---|
utf8mb4_general_ci | Faster comparisons, but less accurate | Performance-focused systems |
utf8mb4_unicode_ci | Unicode-standard, more accurate comparisons | General-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_cies recomendada. - Estandariza la configuración del servidor (
my.cnf) y los conjuntos de caracteres de conexión. - Especifica explícitamente
utf8mb4a nivel de base de datos, tabla y columna. - Utiliza
VARCHAR(191)para evitar limitaciones de longitud de clave de índice. - Usa
utf8mb4_unicode_cipara 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?
| Collation | Characteristics | Use Case |
|---|---|---|
utf8mb4_general_ci | Faster comparisons, but less accurate | Performance-focused systems |
utf8mb4_unicode_ci | Unicode-standard, accurate comparisons | General-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! 🔹


