Quel classement dois-je choisir pour un site Web multilingue?

25

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 somethingpour la sóméthíngsaisie, cela doit également être insensible à la casse.

Comment savoir quel est le meilleur choix à faire? Quel classement convient le mieux à ce cas?

BrunoLM
la source
4
Vous voudrez peut-être reformuler la question afin qu'elle ne sonne pas de manière si subjective - la "meilleure" collation selon quelle mesure? :)
TML
Le nouveau titre se lit beaucoup mieux
TML

Réponses:

16

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.

TML
la source
Oui, UTF-8 peut gérer les 1,1 million de points de code Unicode.
vz0
Merci - je pensais qu'il y avait des personnages Han ou similaires qui n'étaient pas pris en charge en UTF-8, c'est bien d'avoir une réponse solide.
TML
8

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.strxfrmest 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) == 38et 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 strxfrmpour 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.utf8locales 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 strxfrmtransformation 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.utf8les Danois et un selon de_DE.utf8les 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.

Jonas Kölker
la source