Un classement a-t-il une influence sur la vitesse d'une requête? La taille d'une table change-t-elle en fonction du classement?
Si je veux construire un site Web qui doit prendre en charge toutes les langues possibles (prenons par exemple Google), quel serait le classement recommandé?
J'aurai besoin de stocker des caractères tels que 日本語
, mes recherches sur le site Web devront retourner something
pour la sóméthíng
saisie, cela doit également être insensible à la casse.
Comment savoir quel est le meilleur choix à faire? Quel classement convient le mieux à ce cas?
performance
sql-server
collation
BrunoLM
la source
la source
Réponses:
D'une manière générale, l'une des variantes Unicode est probablement la meilleure pour la prise en charge d'un large langage - UTF-8 va utiliser moins de mémoire par point de code, et aura donc un léger avantage dans tout compromis temps / espace que vous vous trouvez à faire; cependant, je pense qu'il y a certains des langages / scripts les plus ésotériques que l'UTF-8 ne peut pas représenter (mais je n'en suis pas sûr à 100%, je n'ai pas fait une étude exhaustive sur la question).
Cet article Wikipedia pourrait éclairer sur les inconvénients / avantages de chacun.
la source
Je pense que vous devez utiliser un classement Unicode insensible à l'accent et à la casse. S'il vous plaît lire les articles MSDN Sélection Collation et Utilisation de classements SQL et tous les articles liés.
la source
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:
locale.strxfrm
est une fonction quiReturns 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îneouüö
est triée. Dansde_DE.utf8
, la chaîneoöuü
est triée. Notez quelen(long_form) == 38
et 38> 13. (La longueur est également de 38 poucesde_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 commestrxfrm
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 lesde_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 selonde_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.
la source