Bonjour,
Ma requête MySQL utilise ORDER BY mais affiche les résultats en plaçant les caractères accentués après les caractères de base (exemple é après z ou Z).
Est-ce qu'il est possible de les trier dans l'ordre naturel?
Version imprimable
Bonjour,
Ma requête MySQL utilise ORDER BY mais affiche les résultats en plaçant les caractères accentués après les caractères de base (exemple é après z ou Z).
Est-ce qu'il est possible de les trier dans l'ordre naturel?
Cela dépend de la collation de ta colonne.
Pour commencer tu peux vérifier l'état actuel :
La doc :select all TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_SET_NAME, COLLATION_NAME from information_schema.COLUMNS where TABLE_SCHEMA = 'ta_base' and TABLE_NAME = 'ta_table';
https://dev.mysql.com/doc/refman/8.0/en/charset.html
https://dev.mysql.com/doc/refman/8.0...t-collate.html
Sans avoir à changer la collation du serveur, de la base de données, de la table ou de la colonne, on peut la modifier grâce au mot clef COLLATE de la clause ORDER BY.
Voir le manuel de référence ICI.
Après essai, je constate que certaines collation sont incompatibles avec celle de départ (utf8_general_ci). Même en modifiant le choix de départ, je ne sais pas quelle collation choisir.
Tu peux faire cette requête pour vérifier les couples collations/jeux compatibles et dispos sur ton système :
Les principaux aujourd'hui sont :select all * from information_schema.COLLATIONS where CHARACTER_SET_NAME regexp 'utf8' order by COLLATION_NAME asc;
ai = insensible aux accentsCOLLATION_NAME CHARACTER_SET_NAME utf8mb4_0900_ai_ci utf8mb4 utf8mb4_0900_as_ci utf8mb4 utf8mb4_0900_as_cs utf8mb4
as = sensible aux accents
ci = insensible à la casse
cs = sensible à la casse
Perso j'utilise utf8mb4 // utf8mb4_0900_ai_ci (c'est la config par défaut des configs MySQL actuelles).
Si besoin ponctuellement de sensibilité je fais ORDER BY ma_colonne COLLATE utf8mb4_0900_as_cs ASC.
Attention, les possibilités dépendent de ton SGBDR (MySQL ? MariaDB ?) et de sa version (MySQL 8 ?)
Merci @Escatefigue et @Séb. pour ces explications mais je viens de m'apercevoir que ma table est correctement triée. Mais le rendu avec DataTable (jQuery) est retrié dans le mauvais ordre. Il faut que je cherche de ce côté, s'il est possible de faire quelque chose.
Je considère ma question comme résolue.
Toujours intéressant à lire, ne serait-ce que pour la définition précise des termes, et pour les subtilités du tri en français , et ce même si je ne sais pas où en est MySQL 8 (l'article porte sur MySQL 5.5) sur le sujet: https://blog.developpez.com/sqlpro/p..._grand_folklor
C'est un peu ardu mais intéressant.
Stricto sensu, une table n'est pas triée, ça n'a pas de sens, une table est un ensemble dont les éléments n'ont aucun ordre naturel.
La seule façon de garantir un ordre de restitution des données c'est d'utiliser la clause ORDER BY.
Mais, et c'est ce qui piège régulièrement les développeurs peu aguerris, comme beaucoup de requêtes utilisent des index, si l'optimiseur choisit de faire un index scan de tel index (cas des index couvrants par exemple), alors tout se passe comme s'il y avait un ordre "naturel" des données, mais c'est un leurre : il suffit que le contenu de la table évolue pour que la même requête exécutée de nouveau produise un ordre différent. Attention donc. On n'insistera jamais assez sur le besoin de spécifier ORDER BY.