Introducción
Los cotejamientos en MySQL son un aspecto clave a la hora de trabajar con bases de datos, especialmente si desarrollas proyectos web con PHP o frameworks modernos. Aunque muchas veces se pasan por alto, los cotejamientos (collations) determinan cómo se comparan, ordenan y buscan los datos de tipo texto dentro de una base de datos.
En este artículo de Sutil Web, descubrirás qué son los cotejamientos en MySQL, cómo funcionan, qué tipos existen y cómo elegir el más adecuado para tus proyectos web.
¿Qué son los cotejamientos en MySQL?
Los cotejamientos en MySQL son reglas que definen cómo se comparan los caracteres dentro de un conjunto de caracteres (charset). Es decir, determinan:
- Si las comparaciones distinguen entre mayúsculas y minúsculas
- Cómo se ordenan los textos (ORDER BY)
- Cómo se realizan búsquedas (LIKE, =, etc.)
Por ejemplo:
utf8_general_ci→ No distingue entre mayúsculas y minúsculas (case insensitive)utf8_bin→ Sí distingue entre mayúsculas y minúsculas (case sensitive)
Ejm
SELECT 'Hola' = 'hola';
- Con
utf8_general_ci→ resultado: TRUE - Con
utf8_bin→ resultado: FALSE
Esto puede afectar directamente al comportamiento de tu aplicación web.
Tipos de cotejamientos en MySQL
En MySQL existen múltiples tipos de cotejamientos, pero los más utilizados son:
1. Cotejamientos Case Insensitive (ci)
- Ejemplo:
utf8mb4_general_ci - No distingue entre mayúsculas y minúsculas
- Ideal para búsquedas de usuario
Ejm
«web» = «WEB» → TRUE
2. Cotejamientos Case Sensitive (cs o bin)
- Ejemplo:
utf8mb4_bin - Distingue entre mayúsculas y minúsculas
- Más estricto
Ejm
«web» ≠ «WEB»
3. Cotejamientos Unicode
- Ejemplo:
utf8mb4_unicode_ci - Mejor soporte para idiomas y caracteres especiales
- Recomendado para aplicaciones internacionales
4. Cotejamientos específicos por idioma
- Ejemplo:
utf8mb4_spanish_ci - Adaptados a reglas lingüísticas concretas
Ejm
Orden correcto de «ñ» en español
Diferencia entre charset y collation
Es muy común confundir estos dos conceptos:
- Charset (conjunto de caracteres) → Define qué caracteres se pueden almacenar
- Collation (cotejamiento) → Define cómo se comparan esos caracteres
Ejm
- Charset:
utf8mb4 - Collation:
utf8mb4_unicode_ci
Recomendación
Utiliza siempre utf8mb4 para soportar emojis y caracteres modernos.
Cómo ver y cambiar el cotejamiento en MySQL
Ver el cotejamiento actual
SHOW VARIABLES LIKE 'collation%';
Cambiar el cotejamiento de una base de datos
ALTER DATABASE nombre_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Cambiar el cotejamiento de una tabla
ALTER TABLE nombre_tabla
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Cambiar el cotejamiento de una columna
ALTER TABLE nombre_tabla
MODIFY columna VARCHAR(255)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Buenas prácticas para elegir un cotejamiento
Para proyectos web modernos como los que desarrollas en Sutil Web, sigue estas recomendaciones:
- Usa utf8mb4 siempre que sea posible
- Elige
utf8mb4_unicode_cipara compatibilidad internacional - Usa
utf8mb4_binsolo si necesitas comparaciones estrictas - Mantén coherencia en toda la base de datos
- Evita mezclar diferentes collations en tablas relacionadas
Ejm
En una tienda online, usar utf8mb4_unicode_ci permite que los usuarios encuentren productos aunque escriban en mayúsculas o con errores leves.
Conclusión
Los cotejamientos en MySQL son fundamentales para garantizar el correcto funcionamiento de cualquier aplicación web. Elegir el adecuado puede marcar la diferencia entre una búsqueda eficiente y una experiencia de usuario deficiente.
Si estás desarrollando proyectos web con bases de datos, entender y aplicar correctamente los collations te permitirá mejorar tanto el rendimiento como la precisión de tus consultas.
En Sutil Web, recomendamos siempre trabajar con configuraciones modernas como utf8mb4_unicode_ci, asegurando compatibilidad, escalabilidad y una mejor experiencia para el usuario final.
Referencias externas
- https://dev.mysql.com/doc/refman/8.0/en/charset-general.html
- https://dev.mysql.com/doc/refman/8.0/en/collation.html
- https://www.php.net/manual/es/mysqlinfo.concepts.charset.php
- https://mariadb.com/docs/server/reference/data-types/string-data-types/character-sets
- https://stackoverflow.com/questions/1049728/mysql-get-character-set-of-database-or-table-or-column
