Al trabajar con datos textuales, a menudo es necesario el soporte para diferentes idiomas y alfabetos. Para esto, en SQL se utilizan reglas de ordenamiento — COLLATION. COLLATION define cómo se comparan y ordenan las cadenas. Es importante establecer correctamente el COLLATION a nivel de columna, tabla o consulta para trabajar adecuadamente con las particularidades lingüísticas (por ejemplo, ё ≠ е).
SELECT * FROM users ORDER BY username COLLATE 'ru_RU.UTF8';
Esta consulta ordena a los usuarios según el alfabeto ruso. En diferentes SGBD, la sintaxis de collate puede variar.
COLLATE utf8mb4_unicode_ci o utf8mb4_ru_0900_as_cs para tener en cuenta el registro y el idioma.COLLATE Cyrillic_General_CS_AS — soporte para el idioma ruso, distinción de registro (CS = sensible a mayúsculas, AS = sensible a acentos).Importante: COLLATION también afecta la búsqueda (LIKE, comparaciones), ¡no solo la ordenación!
¿Cuáles son los problemas que existen al ordenar cadenas con diferentes COLLATION en una misma consulta, y es posible agregar datos con diferentes órdenes de clasificación sin conversiones explícitas?
ERROR: si el COLLATION es diferente (por ejemplo, en una columna — utf8mb4_unicode_ci, en la otra — utf8mb4_bin), al intentar hacer UNION o compararlas directamente, se lanzará un error de incompatibilidad de COLLATION.
Correcto: siempre convierte las cadenas a un único COLLATION mediante la construcción COLLATE.
SELECT name COLLATE 'utf8mb4_unicode_ci' FROM customers UNION SELECT name COLLATE 'utf8mb4_unicode_ci' FROM suppliers;
Historia 1
En una gran plataforma de e-commerce, al exportar a Excel listas de clientes en ruso, se notó que los usuarios con nombres que empezaban con 'Ё' aparecían al final de la lista, mientras que los que empezaban con 'Е' al principio. La razón fue la diferencia en COLLATION — se utilizaba el estándar latino en lugar del ruso, y la ordenación no correspondía al orden alfabético habitual. Los usuarios se quejaban de la ordenación poco intuitiva.
Historia 2
En un sistema médico, diferentes tablas contenían campos de texto con diferentes COLLATION (por defecto y con la especificación explícita del ruso). Después de cambiar el esquema de la tabla, los informes agregados dejaron de funcionar, la consulta comenzó a devolver "COLLATION conflict". El soporte técnico tuvo que especificar explícitamente COLLATE en cientos de consultas.
Historia 3
Una API para búsqueda por apellido solo funcionaba con la escritura exacta de mayúsculas y minúsculas (sensible a mayúsculas), aunque los usuarios esperaban insensibilidad al registro. Resultó que la columna se había creado con COLLATION *_CS, lo que hacía que la búsqueda fuera sensible al registro. Se corrigió a *_CI (insensible a mayúsculas), lo que resolvió el problema.