O que significa agrupamento?


138

O que significa agrupamento no SQL e o que ele faz?


2
@gbn: Aliás, o agrupamento funciona de maneira muito semelhante no MSSQL e no MySQL.
Piskvor saiu do prédio 27/12/10


@Piskvor: Exceto algumas das opções de agrupamento do mySql (por exemplo, UTF8) não estão disponíveis no MSSQL: msdn.microsoft.com/en-us/library/ms144250.aspx
CB

@ CB: Não negando isso; a semelhança é mais profunda que os conjuntos de caracteres (des) suportados.
Piskvor saiu do prédio

Respostas:


60

O agrupamento pode ser simplesmente considerado como uma ordem de classificação.

Em inglês (e é primo estranho, americano), agrupar pode ser uma questão bastante simples, que consiste em ordenar pelo código ASCII.

Depois de entrar nessas estranhas línguas europeias com todos os seus sotaques e outros recursos, o agrupamento muda. Por exemplo, embora as diferentes formas acentuadas apossam existir em pontos de código diferentes, todas elas precisam ser classificadas como se fossem a mesma letra.


4
Diferentes sotaques normalmente significa que eles precisam ser classificadas como se fossem diferentes letras - por exemplo e, ë, é, ě, e è pode ser letras distintas para efeitos de ordenação (mas possivelmente a mesma letra na pesquisa, malditos os europeus loucos;)).
Piskvor saiu do prédio 27/12/10

1
@Piskvor: as coordenadas de suas informações não estão apontando para um determinado país usando um alfabeto com 42letras, sendo que 15elas possuem diacríticos?
Quassnoi

4
@Quassnoi: Bem, sim e? Estou implicando em algum lugar que não sou louco? ; o) (embora graças a Deus pelo Unicode, eu ficaria louca se ainda tivesse que trabalhar com conjuntos de caracteres específicos de cada país)
Piskvor saiu do prédio

3
@Piskvor: desculpe, desculpe, você é perfeitamente louco! :)
Quassnoi

É apenas para classificação ou também para where st= 'aaa'?
Royi Namir 04/10/19

42

Além das "letras acentuadas serem classificadas de maneira diferente das letras não acentuadas" em alguns idiomas da Europa Ocidental, você deve levar em conta os grupos de letras, que às vezes também são classificados de forma diferente.

Tradicionalmente, em espanhol, "ch" era considerado uma letra por si só, o mesmo que "ll" (ambos representando um único fonema); portanto, uma lista seria classificada assim:

  • caballo
  • cinco
  • coche
  • carvão
  • chocolate
  • chueco
  • dado
  • (...)
  • lámpara
  • luego
  • llanta
  • lluvia
  • madera

Notas de todas as palavras que começam com simples c ir juntos, exceto palavras começando com ch que ir depois deles, mesmo com ll -Iniciando palavras que vão depois de todas as palavras que começam com um único l . Essa é a ordem que você verá em antigos dicionários e enciclopédias, às vezes até hoje por organizações muito conservadoras.

A Royal Academy of the Language mudou isso para facilitar a acomodação do espanhol no mundo da computação. No entanto, ± ainda é considerado uma letra diferente do que n e vai depois de ele, e antes de o . Portanto, esta é uma lista ordenada corretamente:

  • Namíbia
  • número
  • ñandú
  • ñú
  • obra
  • ojo

Ao selecionar o agrupamento correto, você realiza tudo isso automaticamente :-)


OK, um agrupamento é bastante útil para a classificação correta, mas ainda é útil para comparações? Por exemplo, eu gostaria que 'ñandú' e 'nandu' aparecessem iguais, por razões práticas ... O mecanismo de intercalação poderia me ajudar nessa tarefa?
CB

@CB: Se você quer dizer algo como selecionar todas as linhas em que o valor de uma coluna é igual a 'Aéreo' e o SQL S. retorna linhas com 'aereo', 'aereó', 'AerEO' e similares - sim, definindo um agrupamento específico por apenas um consulta pode fazer isso. Você terá problemas de desempenho, no entanto, se esse agrupamento for muito diferente do nativo do banco de dados. E se você usa tabelas temporárias, também deve acompanhar o agrupamento do tempdb ... Mas você pode fazê-lo.
Joe Pineda

Nesse caso, você poderia explicar um pouco mais? Particularmente, a consulta direta "SELECT word FROM test WHERE word LIKE 'nandu'" seria capaz de fazer isso? E qual agrupamento devo usar para que funcione? (Note que eu estou preocupado com sinais diacríticos, e não apenas acentua ...)
CB

2
@CB dê uma olhada na parte 'AI' ou 'AS' do agrupamento (Accent Insensitive e Accent Sensitive).
Dustin Kendall

14

Regras que informam como comparar e classificar strings: ordem das letras; se o caso importa, se os diacríticos importam etc.

Por exemplo, se você quiser que todas as letras sejam diferentes (por exemplo, se você armazenar nomes de arquivos UNIX), use o UTF8_BINagrupamento:

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

---
0

Se você deseja ignorar diferenças de maiúsculas e minúsculas (por exemplo, para um mecanismo de pesquisa), use o UTF8_GENERAL_CIagrupamento:

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

---
1

Como você pode ver, esse agrupamento (regra de comparação) considera capital Ae baixa äa mesma letra, ignorando maiúsculas e minúsculas diferenças diacríticas.


10

Agrupamento define como você classifica e compara valores de sequência

Por exemplo, define como lidar com

  • acentos ( äàaetc)
  • case ( Aa)
  • o contexto da linguagem:
    • Em um agrupamento francês, cote < côte < coté < côté.
    • No padrão do SQL Server Latin1, cote < coté < côte < côté
  • Classificações ASCII (um agrupamento binário)

5

Agrupar significa atribuir alguma ordem aos caracteres em um alfabeto, por exemplo, ASCII ou Unicode etc.

Suponha que você tenha 3 caracteres no alfabeto - {A, B, C}. Você pode definir alguns exemplos de agrupamentos atribuindo valores integrais aos caracteres

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

De fato, você pode definir n! agrupamentos em um alfabeto de tamanho n. Dada essa ordem, diferentes rotinas de classificação, como as classificações de strings LSD / MSD, fazem uso delas para classificar strings.


3

O agrupamento determina como seus dados são classificados e comparados. Muitas vezes é importante no que diz respeito à internacionalização, por exemplo, como você classifica o kanji japonês?

Se você pesquisar no Google Collation e SQL Server, encontrará muitos artigos discutindo isso!


3

Referência é retirada deste artigo: Um agrupamento é um conjunto de regras para comparar caracteres em um conjunto de caracteres. Ele também determinou a classificação dos caracteres e a ordem adequada de dois caracteres varia de idioma para idioma. Um agrupamento comparou duas cadeias de caracteres como, se uma palavra é maior que outra, e classificou de acordo.

Se você estiver usando o conjunto de caracteres "latin1", poderá usar o agrupamento "latin1_swedish_ci".

Você deve escolher o agrupamento correto, pois o agrupamento incorreto pode afetar o desempenho do banco de dados.


2

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

Agrupar é a montagem de informações escritas em um pedido padrão. (...) Um algoritmo de intercalação, como o algoritmo de intercalação Unicode, define uma ordem através do processo de comparação de duas cadeias de caracteres e de decidir qual deve ser anterior à outra.



1
Este artigo realmente explica tudo.
Joe Pineda

3
@Joe Pineda. Talvez isso realmente explique tudo, mas o leitor quer saber tudo? Ou é possível que o leitor simplesmente deseje uma resposta concisa e confiável que cubra os elementos e funções mais fundamentais e comumente usados ​​para agrupar, para que possa lê-la rapidamente e retomar o trabalho em qualquer tarefa, tarefa ou projeto que originou a pergunta a ser respondida? começar com?
cfwschmidt

2
@TJCrowder Eu aprecio a ironia nisso

1

O agrupamento é como o SQL Server decide como classificar e comparar o texto.

Veja MSDN .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.