Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1461 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2373825
sltpaulo
Posté le 13-01-2021 à 15:46:51  profilanswer
 

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.

mood
Publicité
Posté le 13-01-2021 à 15:46:51  profilanswer
 

n°2373832
pluj
Posté le 13-01-2021 à 16:56:31  profilanswer
 

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
n°2373865
sltpaulo
Posté le 14-01-2021 à 10:40:45  profilanswer
 

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.

n°2373900
pluj
Posté le 14-01-2021 à 19:34:24  profilanswer
 

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
n°2374209
rufo
Pas me confondre avec Lycos!
Posté le 21-01-2021 à 14:18:57  profilanswer
 

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
n°2386569
djinto
Posté le 30-05-2021 à 08:41:10  profilanswer
 

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.

n°2386570
djinto
Posté le 30-05-2021 à 09:00:14  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
MySql indisponible ce matinSauvegarde de bases MySQL
[PHP/MySQL] PDO - bindValue ça bind pas[MySQL] MAJ d'une table avec trigger et conditions
[MySQL] Table obèseInstallation MySQL
php - MySql - VariableCompter le nombre de caractères en C
MYSQL : update et select en une seule requêteMySQL
Plus de sujets relatifs à : [MySQL] Order by sur caractères spéciaux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR