O que significa exatamente conjunto de caracteres e agrupamento?


316

Eu posso ler a documentação do MySQL e é bem claro. Mas, como alguém decide qual conjunto de caracteres usar? Em quais dados o agrupamento tem efeito?

Estou pedindo uma explicação dos dois e como escolhê-los.

Respostas:


512

Dos documentos do MySQL :

Um conjunto de caracteres é um conjunto de símbolos e codificações. Um agrupamento é um conjunto de regras para comparar caracteres em um conjunto de caracteres. Vamos deixar clara a distinção com um exemplo de conjunto de caracteres imaginários.

Suponha que tenhamos um alfabeto com quatro letras: 'A', 'B', 'a', 'b'. Atribuímos a cada letra um número: 'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3. A letra 'A' é um símbolo, o número 0 é a codificação para 'A' , e a combinação de todas as quatro letras e suas codificações é um conjunto de caracteres.

Agora, suponha que desejamos comparar dois valores de string, 'A' e 'B'. A maneira mais simples de fazer isso é observar as codificações: 0 para 'A' e 1 para 'B'. Como 0 é menor que 1, dizemos que 'A' é menor que 'B'. Agora, o que acabamos de fazer é aplicar um agrupamento ao nosso conjunto de caracteres. O agrupamento é um conjunto de regras (apenas uma regra neste caso): "compare as codificações". Chamamos isso de mais simples de todas as agrupações possíveis, uma ordenação binária.

Mas e se quisermos dizer que as letras minúsculas e maiúsculas são equivalentes? Então teríamos pelo menos duas regras: (1) trate as letras minúsculas 'a' e 'b' como equivalentes a 'A' e 'B'; (2) depois compare as codificações. Chamamos isso de agrupamento que não diferencia maiúsculas de minúsculas. É um pouco mais complexo que um agrupamento binário.

Na vida real, a maioria dos conjuntos de caracteres possui muitos caracteres: não apenas 'A' e 'B', mas alfabetos inteiros, às vezes vários alfabetos ou sistemas de escrita oriental com milhares de caracteres, juntamente com muitos símbolos especiais e sinais de pontuação. Também na vida real, a maioria dos agrupamentos possui muitas regras: não apenas insensibilidade a maiúsculas e minúsculas, mas também insensibilidade a sotaques (um "sotaque" é uma marca anexada a um caractere como no alemão 'ö') e mapeamentos de vários caracteres (como a regra que ' ö '=' OE 'em um dos dois agrupamentos alemães).


206

Uma codificação de caracteres é uma maneira de codificar caracteres para que eles caibam na memória. Ou seja, se o conjunto de caracteres for ISO-8859-15, o símbolo do euro, €, será codificado como 0xa4 e, em UTF-8, será 0xe282ac.

O agrupamento é como comparar caracteres, em latin9, existem letras como e é è ê f, se classificadas por sua representação binária, desaparecerá, e f é ê èmas se o agrupamento estiver definido como, por exemplo, francês, você os terá na ordem que achou que eles seria, que é todos e é è êiguais, e então f.


5
Importante observar que pode haver muitos agrupamentos diferentes para um único conjunto de caracteres. O que está "certo" depende da semântica do texto, que normalmente é determinada pelo idioma em que está escrito.
Phil

20

Um conjunto de caracteres é um subconjunto de todos os glifos escritos. Uma codificação de caracteres especifica como esses caracteres são mapeados para valores numéricos. Algumas codificações de caracteres, como UTF-8 e UTF-16, podem codificar qualquer caractere no Conjunto Universal de Caracteres. Outros, como US-ASCII ou ISO-8859-1, podem codificar apenas um pequeno subconjunto, pois usam 7 e 8 bits por caractere, respectivamente. Como muitos padrões especificam um conjunto de caracteres e uma codificação de caracteres, o termo "conjunto de caracteres" geralmente é substituído livremente por "codificação de caracteres".

Um agrupamento compreende regras que especificam como os caracteres podem ser comparados para classificação. As regras de agrupamento podem ser específicas do local: a ordem correta de dois caracteres varia de idioma para idioma.

A escolha de um conjunto de caracteres e agrupamento se resume a se seu aplicativo é internacionalizado ou não. Caso contrário, em qual local você está segmentando?

Para escolher qual conjunto de caracteres você deseja suportar, você deve considerar seu aplicativo. Se você estiver armazenando informações fornecidas pelo usuário, pode ser difícil prever todos os locais nos quais o software será usado. Para oferecer suporte a todos, talvez seja melhor oferecer suporte ao UCS (Unicode) desde o início. No entanto, há um custo para isso; agora muitos caracteres da Europa Ocidental exigirão dois bytes de armazenamento por caractere, em vez de um.

Escolher o agrupamento correto pode ajudar no desempenho se o banco de dados usar o agrupamento para criar um índice e, posteriormente, usar esse índice para fornecer resultados classificados. No entanto, como as regras de intercalação geralmente são específicas do código de idioma, esse índice será inútil se você precisar classificar os resultados de acordo com as regras de outro código de idioma.


desculpe cara eu sou apenas iniciante e só preciso do seu esclarecimento. Então, eu posso entender agrupamentos como este, é o que garante que cada caractere (seja latino ou chinês) seja adequadamente reconhecido e receba as respectivas codificações. Isso está correto? Espero pela sua resposta
Mirich

1
@Mirich Não, agrupamento é informação sobre como classificar caracteres. Diferentes regiões do mundo preferem classificar os personagens de maneiras diferentes.
22618

3

Eu sugiro usar utf8mb4_unicode_ci, que é baseado no padrão Unicode para classificação e comparação, que classifica com precisão em uma ampla variedade de idiomas.


3
do OP: "Eu estou pedindo uma explicação dos dois e como escolhê-los"
Dan Esparza

1
@ simhumileco, desculpe cara eu sou apenas iniciante e só preciso do seu esclarecimento. Então, eu posso entender agrupamentos como este, é o que garante que cada caractere (seja latino ou chinês) seja adequadamente reconhecido e receba as respectivas codificações. Isso está correto? Espero pela sua resposta
Mirich

1
@Mirich Tudo depende de qual codificação você usa em outros lugares, se você usar UTF-8codificação em um fora do sistema do banco de dados, então tudo no banco de dados também deve ser escrito corretamente se você usar utf8mb4em MySQL . Quando se trata da operação correta de classificação, comparação e transformação de texto para caracteres específicos no MySQL , é difícil encontrar a solução perfeita, mas *_unicode_cicertamente é melhor do que isso *_general, mas também tem suas desvantagens. Por favor, leia: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
simhumileco
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.