[MySQL] Order by sur caractères spéciaux

Order by sur caractères spéciaux [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 13-01-2021 à 15:46:51    

Bonjour et bonne année!
 
Soucis d'ordering sur une base de données MySQL engine MyIsam
 
Problème : ordering non fonctionnelle sur des caractères spéciaux.
Exemple : table "users" 5 entrées (champ 'nom')

  • LØKKEGAARD
  • CSEH
  • ŠIMEČKA
  • BRUNET
  • RIES


La requete suivante (

Code :
  1. Select nom from users order by nom asc

) va me donner :

  • ŠIMEČKA
  • CSEH
  • BRUNET
  • LØKKEGAARD
  • RIES


Or ŠIMEČKA devrait se trouver à la fin.
(Autres lettres possible : ÝĶĄŅĻĚŻĒŮŹȘĽỶĪŠŽÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝÞßþČŞĆŁĂȚŇŃŪĖĎŐŘĘĀŚ)
Est-ce que quelqu'un a une solution a ça? (charset DB : utf8 )
 
Paul.

Reply

Marsh Posté le 13-01-2021 à 15:46:51   

Reply

Marsh Posté le 13-01-2021 à 16:56:31    

Bonjour,
 
c'est l'interclassement de ta colonne qui détermine comment ses données sont ordonnées. Le tout est d'utiliser le plus adéquat en fonction de la langue (c'est quoi comme langue d'ailleurs ?).
 
EDIT : c'est un mélange de langue ? (danois + slovaque + ...) Si oui, pas dit que la collation Unicode par défaut (que tu utilises probablement déjà) corresponde à ce que tu veuilles :/


Message édité par pluj le 13-01-2021 à 17:04:26
Reply

Marsh Posté le 14-01-2021 à 10:40:45    

Salut pluj,
 
Concernant les langues : toutes les langues d'Europe, donc du bulgare, du russe, du gaelique, grec, français etc...
Je fais egalement un collate en utf8mb4_general_ci unicode, etc, mais j'ai pas vraiment le choix, dû à la diversité des utilisateurs, pour éviter les problèmes d'encodages....
Pour le moment mis à part dupliquer la colonne par script et avoir une conversion de toutes les lettres en alphabet latin, je vois pas trop d'autre possibilités  => problème système pas très robuste si j'oublie des caractère, l'ajout de trigger m'embête un peu également donc...
Je suis ouvert à toute piste de réflexion au cas ou.
 
En tout cas, merci d'avoir pris le temps de répondre.

Reply

Marsh Posté le 14-01-2021 à 19:34:24    

Salut,
 
à moins d'écrire ton propre interclassement, ça ne va pas être possible je pense car une collation (ou interclassement) correspond à une langue or tes données sont associées à plusieurs langues. (ie : impossible de contenter tout le monde)
 
Tu ne pourrais pas faire un ORDER BY via un interclassement temporaire qui te semblerait le mieux correspondre à l'utilisateur courant dans ce cas ? (ORDER BY nom COLLATE nom de l'interclassement ?)
 
Une transliteration (classe Tranlisterator de l'extension intl), il faut voir, ça a tout de même ses limites.


Message édité par pluj le 14-01-2021 à 19:36:45
Reply

Marsh Posté le 21-01-2021 à 14:18:57    

Regarde si par trigger tu peux pas générer automatiquement le contenu de la colonne supplémentaire. Perso, je vois pas d'autre solution que l'ajout d'une colonne.
Ou alors, tu crées une procédure/fonction dans Mysql qui prend en entrée la chaîne à convertir et te donne en sortie la version convertie comme tu veux et tu fais le order by là dessus.
Ex : ORDER BY MA_FONC(champ)
ou SELECT champ, MA_FONC(champ) AS Tri FROM.... ORDER BY Tri
 
Edit : bien entendu, ça marche si y'a pas trop de données. Si y'en a beaucoup, faudra passer par la solution de la colonne supplémentaire.


Message édité par rufo le 21-01-2021 à 14:20:20

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-05-2021 à 08:41:10    

Bonjour,
 
 
mais, même avec un interclassement qui gêres --> un grand nombre d'alphabets <-- ,
l'affichage 'order by' croissant ( alphabétique ) , ou   décroissant ( désalphabétique ),
 
c'est mettre du + petit au + grand des 'séries de chiffres' dans des --> tables de caractères différentes <--.
 
Donc "comparer et classer" des valeurs qui ne sont --> pas comparables  <-- .  
 
====================================================
Par contre, il y a --> des étendues d'interclassement <-- qui regroupent beaucoup de langues. { il faut trouver le ( ou les ) + large, dans la doc.  }
 
comme toutes les versions d'ANSI ...., après les " utf -x " , et ASCII   pour la saisie clavier.

Reply

Marsh Posté le 30-05-2021 à 09:00:14    

Un interclassement c'est --> une étendue <-- pour un ou des alphabets.

 

Reprends la doc pour utiliser l'interclassement qui convient.

 

=====================
Lors de ta requête,

 

tu demandes au 'Db Engine' de classer/trier selon un alphabet qui n'est pas le bon.

 

le 'output' est FAUX.

 

Tu a plusieurs solutions :
- un utilisateur a dans ses données son 'alphabet', dans une table. ( 200 langues / 200 listes de caractères ... un forum contient + de listes que ça )
- tu utilises un interclassement plus large, qui couvres plusieurs langues. ( sur les étendues pour plusieurs langues . cf : la doc )
- tu utilises le bon 'interclassement' pour la bonne langue. ( invoquer le bon interclassement lors des requetes )
- tu utilises le bon alphabet lorsque tu tries une liste. ( get_interclassment(arg) )

 

==========================================

 

En fait avec ta requete, et l'interclassement de ta bdd,
tu compares ce qui n'est pas comparable, donc ça échoues.

 


:oups !! double post , ça bouchonnes ce matin. je valide puis ça n'affiches rien. je réécrit puis ça n'affiche rien. je reviens en arrière puis ça m'en affiche un seul.
puis les deux après 'rafraichir'. puis j'édites , puis on est lundi. j'ai pas vu dimanche passé.


Message édité par djinto le 30-05-2021 à 09:04:58

---------------
Nom : Prénom : Age : Adresse : Ville : Code Postal : Num Trois Tel
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed