¿Qué cotejo debo elegir para un sitio web en múltiples idiomas?

25

¿Una intercalación tiene alguna influencia sobre la velocidad de una consulta? ¿El tamaño de una tabla cambia según la clasificación?

Si quiero crear un sitio web que debe admitir todos los idiomas posibles (por ejemplo, Google), ¿cuál sería la clasificación recomendada?

Tendré que almacenar caracteres como 日本語, mis búsquedas en el sitio web tendrán que volver somethingpara la sóméthíngentrada, también debe ser insensible a mayúsculas y minúsculas.

¿Cómo sé cuál es la mejor opción para hacer? ¿Qué cotejo se adapta mejor a este caso?

BrunoLM
fuente
44
Es posible que desee reformular la pregunta para que no suene tan subjetiva: ¿la "mejor" recopilación en qué medida? :)
TML
El nuevo título se lee mucho mejor
TML

Respuestas:

16

En términos generales, una de las variantes de Unicode es probablemente la mejor para un amplio soporte de idiomas: UTF-8 usará menos memoria por punto de código y, por lo tanto, tendrá una ligera ventaja en cualquier compensación de tiempo / espacio que necesite hacer; sin embargo, creo que hay algunos de los lenguajes / scripts más esotéricos que UTF-8 no puede representar (pero no estoy 100% seguro de eso, no he hecho un estudio exhaustivo al respecto).

Este artículo de Wikipedia podría ser esclarecedor sobre las desventajas / ventajas de cada uno.

TML
fuente
Sí, UTF-8 puede manejar los 1.1 millones de puntos de código Unicode.
vz0
Gracias. Pensé que había algunos de los personajes Han o similares que no eran compatibles con UTF-8, es bueno tener una respuesta sólida.
TML
8

Creo que la pregunta como se indicó (20/04/2015, "¿Qué cotejo [...]") no es lo que se quiere decir, dado que la respuesta aceptada se refiere a la codificación en lugar de a la colación. Permítanme responder a la pregunta planteada en lugar de la prevista, solo porque creo que es interesante :-)

Wikipedia dice "La recopilación es el ensamblaje de información escrita en un orden estándar". En informática, la recopilación ha adquirido el significado de "una especificación de dicho orden". En otras palabras, una recopilación es (o implica) una definición de una función de comparación de tres vías.

Creo que la respuesta corta es "definitivamente tal vez". Al menos estoy al tanto de las siguientes travesuras:

#!/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.strxfrmes una función que Returns a string that behaves for cmp locale-aware, es decir, codifica una cadena de modo que una comparación lexicográfica estándar byte a byte con otra cadena codificada de manera similar producirá el mismo resultado que comparar cadenas de acuerdo con la función de clasificación especificada por la configuración regional.

Algunas observaciones: en da_DK.utf8, la cadena ouüöestá ordenada. En de_DE.utf8, la cadena oöuüestá ordenada. Tenga en cuenta que len(long_form) == 38y 38> 13. (La longitud también es de 38 pulg de_DE.utf8.)

Si su base de datos tiene un índice en algún campo de cadena, clasificado según da_DK.utf8, internamente puede estar haciendo algo como strxfrmpara tener una comparación simple. (Por otro lado, los discos son lentos. Puede ser más rápido indexar en base a una representación más compacta, si un costo de comparación más alto por carácter es más que compensado al comparar menos caracteres).

Usted pregunta "¿Una intercalación tiene alguna influencia sobre la velocidad de una consulta?", A lo que estoy bastante seguro de que la respuesta es sí: la intercalación "C" (también conocida como "POSIX") solo compara valores de puntos de código Unicode, mientras que el danés ( da_DK.utf8) y los de_DE.utf8locales alemanes ( ) hacen algo más complicado. Esto tendrá algún impacto en la velocidad de consulta, aunque sospecho que no valdrá la pena preocuparse.

"¿El tamaño de una tabla cambia según la clasificación?" - Me imagino tener un índice de acuerdo con una colación y un índice diferente de acuerdo con otra colación, o solo uno de esos dos índices, con alguna strxfrmtransformación similar aplicada. En ese escenario hipotético, si hay dos colaciones con diferentes características de tamaño, la respuesta es sí.

"¿Cuál sería la clasificación recomendada?" - Eso depende de por qué necesitarías ordenar las cadenas. Si es solo para tener una forma canónica de ordenar cadenas, probablemente iría con "C". Si se trata de presentar datos a los usuarios en orden ordenado de acuerdo con las expectativas del ser humano, y esas expectativas están formadas por su cultura, y desea que la base de datos (y no alguna otra capa) haga la clasificación, tal vez debería crear un índice por clasificación , es decir, al menos uno según da_DK.utf8los daneses y uno según de_DE.utf8los alemanes. Sin embargo, creo que esto podría ser bastante grande con bastante rapidez.

Todo esto depende en gran medida del funcionamiento interno de su base de datos; Creo que va mucho más allá del SQL "estandarizado" (¡lol!). Como siempre, consulte la documentación de su sistema de base de datos específico.

Jonas Kölker
fuente