¿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 something
para la sóméthíng
entrada, 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?
performance
sql-server
collation
BrunoLM
fuente
fuente
Respuestas:
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.
fuente
Creo que deberías usar una clasificación Unicode que sea acento y no distinga entre mayúsculas y minúsculas. Lea los artículos de MSDN Selección de colación y uso de colaciones sql y todos los artículos vinculados.
fuente
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:
locale.strxfrm
es una función queReturns 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 cadenaouüö
está ordenada. Ende_DE.utf8
, la cadenaoöuü
está ordenada. Tenga en cuenta quelen(long_form) == 38
y 38> 13. (La longitud también es de 38 pulgde_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 comostrxfrm
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 losde_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únde_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.
fuente