O que o conjunto de caracteres e o agrupamento significam exatamente?

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

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

De 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 esclarecer a distinção com um exemplo de um conjunto de caracteres imaginário.

Suponha que tenhamos um alfabeto com quatro letras: ‘A’, ‘B’, ‘a’, ‘b’. Nós damos 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 de ‘A’ e a combinação das quatro letras e suas codificações é um conjunto de caracteres.

Agora, suponha que queremos 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 esse mais simples de todos os possíveis agrupamentos de um agrupamento binário.

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) tratar as letras minúsculas ‘a’ e ‘b’ como equivalentes a ‘A’ e ‘B’; (2) então compare as codificações. Chamamos isso de agrupamento sem distinção entre maiúsculas e minúsculas. É um pouco mais complexo que um agrupamento binário.

Na vida real, a maioria dos conjuntos de caracteres tem muitos caracteres: não apenas ‘A’ e ‘B’, mas alfabetos inteiros, às vezes múltiplos alfabetos ou sistemas de escrita orientais com milhares de caracteres, juntamente com muitos símbolos especiais e sinais de pontuação. Também na vida real, a maioria dos collations possui muitas regras: não apenas insensibilidade a maiúsculas e minúsculas, mas também insensibilidade ao sotaque (um “sotaque” é uma marca anexada a um caractere em alemão “ö”) e mapeamentos de múltiplos caracteres (como a regra ö ‘=’ OE ’em um dos dois agrupamentos alemães).

Uma codificação de caracteres é uma maneira de codificar caracteres para que eles se encaixem na memory. 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, há letras como e é è ê f , se ordenadas por sua representação binária, ele vai ef é ê è mas se o agrupamento for definido como, por exemplo, francês, you ‘ Você os terá na ordem que você pensou que eles seriam, o que é tudo igual e, em seguida, f .

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 Universal Character Set. Outros, como o US-ASCII ou o ISO-8859-1, só podem codificar 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” é frequentemente substituído livremente por “codificação de caracteres”.

Um agrupamento compreende regras que especificam como os caracteres podem ser comparados para sorting. As regras de agrupamento podem ser específicas de localidade: a ordem correta de dois caracteres varia de idioma para idioma.

Escolher um conjunto de caracteres e agrupamento se resume a se o seu aplicativo é internacionalizado ou não. Se não, qual localidade você está segmentando?

Para escolher o conjunto de caracteres que você deseja suportar, você deve considerar sua inscrição. Se você estiver armazenando inputs fornecidas pelo usuário, pode ser difícil prever todas as localidades em que seu software será usado. Para dar suporte a todos eles, talvez seja melhor suportar o UCS (Unicode) desde o início. No entanto, há um custo para isso; muitos caracteres da Europa Ocidental agora exigirão dois bytes de armazenamento por caractere em vez de um.

Escolher o agrupamento certo pode ajudar o desempenho se o database 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 de localidade, esse índice será inútil se você precisar classificar os resultados de acordo com as regras de outra localidade.

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