it-swarm-fr.com

Quelle collation dois-je choisir pour un site Web multilingue?

Une collation a-t-elle une influence sur une vitesse de requête? La taille d'une table change-t-elle en fonction de la collision?

Si je veux construire un site Web qui doit prendre en charge toutes les langues possibles (prenons-la pour E.G. Google) qui serait la garantie recommandée?

Je devrai stocker des caractères tels que 日本語, mes recherches sur le site Web devront revenir something pour le sóméthíng Entrée, cela doit également être insensible à la casse.

Comment savoir quel est le meilleur choix à faire? Quelle collation convient mieux à cette affaire?

25
BrunoLM

De manière générale, l'une des variantes Unicode est probablement la meilleure pour un large support linguistique - UTF-8 va utiliser moins de mémoire par code de code et aura ainsi un léger avantage dans tous les délais/spatiaux que vous avez besoin de faire la nécessité de faire; Cependant, je pense qu'il y a certaines des langues/scripts plus ésotériques que UTF-8 ne peut pas représenter (mais je ne suis pas certain à 100% de cela, je n'ai pas fait une étude exhaustive sur la question).

Cet article de Wikipedia peut être éclairant sur les disques/avantages de chacun.

16
TML

Je pense que la question telle que indiquée (sur 2015-04-20, "quelle collation [...]") n'est pas ce que l'on entend, étant donné que les discussions de réponse acceptées sur le codage plutôt que sur la couverture. Laissez-moi répondre à la question indiquée plutôt que celle voulue, juste parce que je pense que c'est intéressant :-)

Wikipedia dit que "la classement est l'assemblage d'informations écrites dans un ordre standard". En informatique, la collation a pris la signification de "une spécification d'un tel ordre". En d'autres termes, une assemblée est (ou implique) une définition d'une fonction de comparaison à trois voies.

Je pense que la réponse courte est "certainement peut-être". Au moins, je suis au courant des shenanigans suivants:

#!/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 que Returns a string that behaves for cmp locale-aware, c'est-à-dire qu'elle code, elle code une chaîne de telle sorte qu'une comparaison lexicographique standard par octe-by-octette contre une autre chaîne codée de la même manière produise le même résultat que la comparaison des chaînes en fonction de la fonction de collement spécifiée par la locale.

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 dans de_DE.utf8.)

Si votre base de données a un index sur certains champs de cordes, rassemblés conformément à da_DK.utf8, il May en interne faire quelque chose comme strxfrm afin d'avoir une comparaison simple. (D'autre part, 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 plus élevé par caractère est supérieur à celui de compenser en comparant moins de caractères.)

Vous demandez "une collation a-t-elle une influence sur une vitesse de requête?", À laquelle je suis sûr que la réponse est oui: la collation "C" (AKA "POSIX") compare simplement les valeurs de point de code UNICODE, alors que le danois ( da_DK.utf8) et allemand (de_DE.utf8) Les locals font quelque chose de plus délicat. Cela aura certains Impact sur la vitesse de la requête, bien que je soupçonne que cela ne vaudra pas la peine de s'inquiéter.

"La taille d'une table change-t-elle en fonction de la collision?" - Je peux imaginer avoir un index selon une classement et un index différent selon une autre collation, ou juste l'un de ces deux indices, avec quelque chose strxfrm- Thant de transformation appliquée. Dans ce scénario hypothétique, s'il y a deux collations avec des caractéristiques de taille différentes, la réponse est oui.

"Quelle serait la collation recommandée?" - Cela dépend de la raison pour laquelle vous auriez besoin de trier les chaînes. Si ce n'est qu'à avoir certains façon canonique de commander des chaînes, j'irais probablement avec "C". S'il s'agit de présenter des données aux utilisateurs dans la commande triée selon les attentes de l'homme et que ces attentes sont façonnées par leur culture, et que vous souhaitez que la base de données (et non une autre couche) fasse le tri, vous devriez peut-être construire un index par collation , c'est-à-dire au moins un selon da_DK.utf8 pour les Danois et un selon de_DE.utf8 pour les Allemands. Je pense que cela pourrait devenir assez gros assez rapidement, cependant.

Tout cela dépend fortement du fonctionnement intérieur de votre base de données; Je pense que ça va bien au-delà de "normalisé" (lol!) SQL. Comme toujours, consultez la documentation sur votre système de base de données spécifique.

8
Jonas Kölker

Je crois que vous devriez utiliser une collation unicode qui est accentuée et insensible à l'insensibilité. Veuillez lire les articles MSDN Sélection de la collation et à l'aide de Collations SQL et tous les articles liés.

8
Marian