Je pense que la question telle qu'énoncée (le 2015-04-20, "Quel classement [...]") n'est pas ce que l'on veut dire, étant donné que la réponse acceptée parle d'encodage plutôt que de classement. Permettez-moi de répondre à la question posée plutôt qu'à la question prévue, simplement parce que je pense que c'est intéressant :-)
Wikipédia dit que "le classement est l'assemblage d'informations écrites dans un ordre standard". En informatique, le classement a pris le sens de "spécification d'un tel ordre". En d'autres termes, un classement est (ou implique) une définition d'une fonction de comparaison à trois.
Je pense que la réponse courte est "certainement peut-être". Au moins, je connais les manigances suivantes:
#!/usr/bin/python
name = u"Jonas K\xf6lker" # \xf6 is o-umlaut
enc = name.encode('utf-8')
assert len(name) == 12 # \xf6 is one character
assert len(enc) == 13 # but two bytes in utf-8
import locale
locale.setlocale(locale.LC_COLLATE, "da_DK.utf8") # works on my machine
long_form = locale.strxfrm(enc)
assert len(long_form) == 38
locale.strxfrm
est une fonction qui Returns a string that behaves for cmp locale-aware
, c'est-à-dire qu'elle code une chaîne de telle sorte qu'une comparaison lexicographique standard octet par octet avec une autre chaîne codée de manière similaire produira le même résultat que la comparaison de chaînes selon la fonction de classement spécifiée par les paramètres régionaux.
Quelques observations: dans da_DK.utf8
, la chaîne ouüö
est triée. Dans de_DE.utf8
, la chaîne oöuü
est triée. Notez que len(long_form) == 38
et 38> 13. (La longueur est également de 38 pouces de_DE.utf8
.)
Si votre base de données a un index sur un champ de chaîne, assemblé selon da_DK.utf8
, il peut faire en interne quelque chose comme strxfrm
pour avoir une comparaison simple. (D'un autre côté, les disques sont lents. Il peut être plus rapide d'indexer sur la base d'une représentation plus compacte, si un coût de comparaison par caractère plus élevé est plus que compensé en comparant moins de caractères.)
Vous demandez "Un classement a-t-il une influence sur la vitesse d'une requête?", Ce à quoi je suis sûr que la réponse est oui: le classement "C" (aka "POSIX") compare simplement les valeurs des points de code unicode, tandis que le danois ( da_DK.utf8
) et les de_DE.utf8
locales allemandes ( ) font quelque chose de plus délicat. Cela aura un certain impact sur la vitesse des requêtes, bien que je pense que cela ne vaudra pas la peine de s'inquiéter.
"La taille d'une table change-t-elle en fonction du classement?" - Je peux imaginer avoir un index selon un classement et un index différent selon un autre classement, ou juste l'un de ces deux indices, avec une strxfrm
transformation semblable à celle appliquée. Dans ce scénario hypothétique, s'il y a deux classements avec des caractéristiques de taille différentes, la réponse est oui.
"quel serait le classement recommandé?" - Cela dépend de la raison pour laquelle vous devez trier les chaînes. Si c'est uniquement pour avoir une manière canonique de classer les chaînes, j'irais probablement avec "C". Si c'est pour présenter les données aux utilisateurs dans un ordre trié en fonction des attentes de l'homme, et ces attentes sont façonnées par leur culture, et vous voulez que la base de données (et non une autre couche) fasse le tri, peut-être devriez-vous construire un index par classement , c'est-à-dire au moins un selon da_DK.utf8
les Danois et un selon de_DE.utf8
les Allemands. Je pense que cela pourrait devenir assez gros assez rapidement, cependant.
Tout cela dépend fortement du fonctionnement interne de votre base de données; Je pense que cela va bien au-delà du SQL "standardisé" (lol!). Comme toujours, consultez la documentation de votre système de base de données spécifique.