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.strxfrm
es 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) == 38
y 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 strxfrm
para 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.utf8
locales 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 strxfrm
transformació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.utf8
los daneses y uno según de_DE.utf8
los 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.