ProgrammationDéveloppeur Backend

Comment réaliser un tri efficace des données en utilisant différents COLLATION (règles de tri) en SQL ? Quelles sont les particularités du support des différentes langues et alphabets ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Lors de la manipulation de données textuelles, il est souvent nécessaire de supporter différentes langues et alphabets. Pour cela, SQL utilise des règles de tri — COLLATION. La COLLATION définit comment les chaînes sont comparées et triées. Il est important de définir correctement la COLLATION au niveau de la colonne, de la table ou de la requête pour travailler correctement avec les particularités linguistiques (par exemple, ё ≠ е).

Exemple :

SELECT * FROM users ORDER BY username COLLATE 'ru_RU.UTF8';

Cette requête trie les utilisateurs selon l'alphabet russe. La syntaxe COLLATE peut varier entre différents SGBD.

  • Pour MySQL : COLLATE utf8mb4_unicode_ci ou utf8mb4_ru_0900_as_cs pour tenir compte de la casse et de la langue.
  • Pour MSSQL : COLLATE Cyrillic_General_CS_AS — support de la langue russe, distinction de la casse (CS = case sensitive, AS = accent sensitive).

Important: La COLLATION affecte également la recherche (LIKE, comparaisons), pas seulement le tri !

Question piégeuse

Quelles sont les problèmes lors du tri de chaînes avec des COLLATION différentes dans une même requête, et peut-on agréger des données avec différents ordres de tri sans conversions explicites ?

ERREUR : si les COLLATION diffèrent (par exemple, une colonne en utf8mb4_unicode_ci, l'autre en utf8mb4_bin), alors une tentative de faire un UNION ou de les comparer directement renverra une erreur d'incompatibilité de COLLATION.

Correct : il faut toujours ramener les chaînes à une seule COLLATION via la construction COLLATE.

SELECT name COLLATE 'utf8mb4_unicode_ci' FROM customers UNION SELECT name COLLATE 'utf8mb4_unicode_ci' FROM suppliers;

Exemples d'erreurs réelles dues à une mauvaise compréhension du sujet


Histoire 1

Sur une grande plateforme d'e-commerce, lors de l'exportation en Excel des listes de clients en russe, il a été remarqué que les utilisateurs avec des noms commençant par 'Ё' apparaissaient à la fin de la liste, tandis que ceux avec 'Е' apparaissaient en début. La raison était la différence de COLLATION — une standard LATIN était utilisé au lieu d'un RUSSE, et le tri ne correspondait pas à l'ordre alphabétique habituel. Les utilisateurs se plaignaient d'un tri peu clair.


Histoire 2

Dans un système médical, différentes tables contenaient des champs de chaîne avec différentes COLLATION (par défaut et en spécifiant explicitement une russe). Après avoir modifié le schéma de la table, les rapports agrégés ont cessé de fonctionner, la requête a commencé à renvoyer "COLLATION conflict". L'assistance technique a dû spécifier explicitement COLLATE dans des centaines de requêtes.


Histoire 3

L'API pour la recherche par nom de famille ne fonctionnait qu'avec l'écriture exacte de lettres majuscules et minuscules (case sensitive), alors que les utilisateurs s'attendaient à une résistance à la casse. Il s'est avéré que la colonne avait été créée avec une COLLATION *_CS, ce qui rendait la recherche sensible à la casse. Le problème a été corrigé en changeant pour *_CI (case insensitive).