¿Qué significa colación?

138

¿Qué significa colación en SQL y qué hace?

LOVE_KING
fuente
2
@gbn: Por cierto, la recopilación funciona de manera muy similar tanto en MSSQL como en MySQL.
Piskvor salió del edificio el
@Piskvor: Excepto algunas de las opciones de clasificación de mySql (por ejemplo, UTF8) no están disponibles en MSSQL: msdn.microsoft.com/en-us/library/ms144250.aspx
CB
@CB: No lo niego; la similitud es más profunda que los charsets (no) soportados.
Piskvor salió del edificio

Respuestas:

60

La colación se puede considerar simplemente como un orden de clasificación.

En inglés (y es un primo extraño, estadounidense), la recopilación puede ser una cuestión bastante simple que consiste en ordenar por el código ASCII.

Una vez que entras en esos extraños idiomas europeos con todos sus acentos y otras características, la colación cambia. Por ejemplo, aunque las diferentes formas acentuadas apueden existir en puntos de código dispares, es posible que todas necesiten clasificarse como si fueran la misma letra.

paxdiablo
fuente
44
Diferentes acentos por lo general significa que tienen que ser ordenados como si fueran diferentes cartas - por ejemplo e, ë, é, ě, y è podrían ser letras distintas a efectos de ordenación (pero posiblemente la misma letra en la búsqueda, maldición aquellos europeos locos;)).
Piskvor salió del edificio el
1
@Piskvor: ¿las coordenadas de su información no apuntan a un determinado país utilizando un alfabeto con 42letras, 15de las cuales tienen signos diacríticos?
Quassnoi
44
@Quassnoi: Bueno, sí, y? ¿Estoy insinuando en alguna parte que no estoy loco? ; o) (aunque gracias a Dios por Unicode, me volvería loco si aún tuviera que trabajar con
grupos
3
@Piskvor: lo siento, lo siento, ¡estás completamente loco! :)
Quassnoi
¿Es solo para ordenar o también para where st= 'aaa'?
Royi Namir
42

Además de "las letras acentuadas se ordenan de manera diferente a las no acentuadas" en algunos idiomas de Europa occidental, debe tener en cuenta los grupos de letras, que a veces también se ordenan de manera diferente.

Tradicionalmente, en español, "ch" se consideraba una letra por derecho propio, igual que "ll" (ambos representan un solo fonema), por lo que una lista se ordenaría así:

  • caballo
  • cinco
  • coche
  • charco
  • chocolate
  • chueco
  • friso
  • (...)
  • lámpara
  • luego
  • llanta
  • lluvia
  • madera

Aviso todas las palabras que empiezan con individuales c van juntas, excepto palabras que empiecen con ch que van después de ellos, lo mismo con ll que empiezan palabras que van después de que todas las palabras que empiezan con una sola l . Este es el orden que verá en diccionarios y enciclopedias antiguos, a veces incluso hoy por organizaciones muy conservadoras.

La Royal Academy of the Language cambió esto para facilitar que el español se acomode en el mundo de la informática. Sin embargo, ñ todavía se considera una letra diferente de n y va después de ella, y antes de o . Entonces esta es una lista correctamente ordenada:

  • Namibia
  • número
  • ñandú
  • ñú
  • obra
  • ojo

Al seleccionar la clasificación correcta, todo esto se hace por usted, automáticamente :-)

Joe Pineda
fuente
Bien, entonces una clasificación es bastante útil para la clasificación correcta, pero ¿sigue siendo útil para las comparaciones? Por ejemplo, me gustaría que 'ñandú' y 'nandu' aparecieran como iguales, por razones prácticas ... ¿Podría el mecanismo de clasificación ayudarme con esta tarea?
CB
@CB: Si quiere decir algo como seleccionar todas las filas donde el valor de una columna es igual a 'Aéreo' y SQL S. devuelve filas con 'aereo', 'aereó', 'AerEO' y similares, sí, estableciendo una clasificación específica para solo un consulta puede hacer eso. Sin embargo, tendrá problemas de rendimiento si esta recopilación es muy diferente de la nativa de la base de datos. Y si usa tablas temporales, también debe realizar un seguimiento de la recopilación de tempdb ... Pero puede hacerlo.
Joe Pineda
En ese caso, ¿podría explicar un poco más? En particular, ¿podría hacer la simple consulta "SELECCIONAR palabra de prueba DONDE la palabra COMO 'nandu'"? ¿Y qué clasificación debo usar para que funcione? (Tenga en cuenta que estoy preocupado por las marcas diacríticas, y no solo por los acentos ...)
CB
2
@CB eche un vistazo a la parte 'AI' o 'AS' de la clasificación (acento insensible y acento sensible).
Dustin Kendall
14

Reglas que indican cómo comparar y ordenar cadenas: orden de letras; si el caso importa, si los diacríticos importan, etc.

Por ejemplo, si desea que todas las letras sean diferentes (por ejemplo, si almacena nombres de archivo UNIX), utilice la UTF8_BINintercalación:

SELECT  'A' COLLATE UTF8_BIN = 'a' COLLATE UTF8_BIN

---
0

Si desea ignorar las diferencias entre mayúsculas y minúsculas (por ejemplo, para un motor de búsqueda), utilice la UTF8_GENERAL_CIintercalación:

SELECT  'A' COLLATE UTF8_GENERAL_CI = 'ä' COLLATE UTF8_GENERAL_CI

---
1

Como puede ver, esta clasificación (regla de comparación) considera mayúscula Ay minúscula äla misma letra, ignorando mayúsculas y minúsculas y diferencias diacríticas.

Quassnoi
fuente
10

La clasificación define cómo ordenar y comparar valores de cadena

Por ejemplo, define cómo lidiar con

  • acentos (äàa etc.)
  • caso (Aa )
  • El contexto del lenguaje:
    • En una colación francesa, cote < côte < coté < côté.
    • En el valor predeterminado de SQL Server Latin1, cote < coté < côte < côté
  • Clases ASCII (una colación binaria)
gbn
fuente
5

La clasificación significa asignar un orden a los caracteres en un alfabeto, por ejemplo, ASCII o Unicode, etc.

Supongamos que tiene 3 caracteres en su alfabeto: {A, B, C}. Puede definir algunas colaciones de ejemplo asignando valores integrales a los caracteres.

  1. Ejemplo 1 = {A = 1, B = 2, C = 3}
  2. Ejemplo 2 = {C = 1, B = 2, A = 3}
  3. Ejemplo 3 = {B = 1, C = 2, A = 3}

De hecho, puede definir n! intercalaciones en un alfabeto de tamaño n. Dado este orden, diferentes rutinas de clasificación como los tipos de cadenas LSD / MSD lo utilizan para ordenar cadenas.

Murali Mohan
fuente
3

La clasificación determina cómo se ordenan y comparan sus datos. A menudo es importante con respecto a la internacionalización, por ejemplo, ¿cómo se clasifican los kanji japoneses?

¡Si buscas en google collation y sql server encontrarás muchos artículos discutiéndolo!

Dr. G
fuente
3

Se toma una referencia de este artículo: Una clasificación es un conjunto de reglas para comparar caracteres en un conjunto de caracteres. También ha ordenado la clasificación de caracteres y el orden apropiado de dos caracteres varía de un idioma a otro. Una intercalación comparó dos cadenas como, si una palabra es mayor que otra, y ordena en consecuencia.

Si está utilizando el juego de caracteres "latin1", puede usar la Clasificación "latin1_swedish_ci".

Debe elegir la clasificación correcta porque la clasificación incorrecta puede afectar el rendimiento de su base de datos.

Anvesh
fuente
2

http://en.wikipedia.org/wiki/Collation

La recopilación es el ensamblaje de información escrita en un orden estándar. (...) Un algoritmo de clasificación como el algoritmo de clasificación Unicode define un orden a través del proceso de comparar dos cadenas de caracteres determinadas y decidir cuál debe venir antes que la otra.

S.Lott
fuente
1
Este artículo realmente lo explica todo.
Joe Pineda
3
@ Joe Pineda. Tal vez realmente lo explique todo, pero ¿quiere el lector saberlo todo? ¿O es posible que el lector simplemente quiera una respuesta concisa y confiable que cubra los elementos y funciones de recopilación más fundamentales y de uso común para que pueda leerla rápidamente y reanudar el trabajo en cualquier tarea, tarea o proyecto que dio lugar a la pregunta? ¿empezar con?
cfwschmidt
2
@TJCrowder Aprecio la ironía en esto
1

La recopilación es cómo el servidor SQL decide cómo ordenar y comparar texto.

Ver MSDN .

Oded
fuente