Aqui está a situação:
- Eu encontrei vários posts para " utf8_bin vs utf8_general_ci ".
- Da mesma forma, " utf8_general_cs vs utf8_general_ci ".
Mas não consigo encontrar um post para " utf8_bin vs utf8_general_cs ". Então, eles são iguais? Se não, qual a diferença entre eles?
Nota: verifiquei que utf8_general_cs não está disponível no MySQL padrão. Posso saber porquê?
A noção de que os agrupamentos binários são os mesmos que diferenciam maiúsculas de minúsculas é, infelizmente, extremamente comum.
No entanto, eles não são funcionalmente equivalentes. Existem quatro áreas onde as diferenças comportamentais podem ser vistas (pelo menos quatro que eu conheço):
Combinando Personagens
Considere ter uma minúscula
ü
("u" com trema) e uma maiúsculaÜ
("U" com trema). Ambos os tipos de agrupamentos serão capazes de distingui-los.Agora, considere ter uma maiúscula
U
e um̈
(combinando trema). Quando o caractere de combinação é colocado após o não acentuadoU
, você obtémÜ
. Visualmente é o mesmo que o singleÜ
("U" com trema). E um agrupamento que diferencia maiúsculas de minúsculas (e até mesmo acentos) parecerá o mesmo, mesmo que um seja um único ponto de código e o outro seja uma combinação de dois pontos de código. Mas um agrupamento binário não pode compará-los como sendo iguais, pois não são os mesmos pontos de código (ou mesmo o mesmo número de pontos de código).Caracteres de largura total
Um agrupamento que faz distinção entre maiúsculas e minúsculas, mas não diferencia largura, seria capaz de igualar
=o=
e=o=
. No entanto, um agrupamento binário não pode parecer igual, pois são pontos de código diferentes.Insensibilidade de sotaque
Um agrupamento que diferencia maiúsculas de minúsculas, mas não diferencia acentos, seria capaz de igualar
o
eô
. No entanto, um agrupamento binário não pode parecer igual, pois são pontos de código diferentes.Ordenação
Um agrupamento que diferencia maiúsculas de minúsculas será classificado
~
antesa
eA
depois dele. Mas, um agrupamento binário classificará esses mesmos caracteres como:A
thena
then~
.Tudo isso está documentado no seguinte post meu:
Não, os agrupamentos binários não diferenciam maiúsculas de minúsculas
Ele é apresentado em termos de Microsoft SQL Server, mas o comportamento é baseado em regras definidas pelo padrão Unicode, que deve ser o mesmo em RDBMSs, idiomas, SOs, etc (com pequena variação devido a qual versão do padrão Unicode está sendo usado e quem fez a implementação, já que o Unicode é apenas um padrão e foi implementado com pequenas variações entre os fornecedores).
Meu palpite é que os agrupamentos "gerais" são obsoletos e foram substituídos por agrupamentos "unicode" e específicos de cultura mais recentes. A documentação (no meio da página, parágrafo começando com " Para qualquer conjunto de caracteres Unicode "), afirma ainda:
Os agrupamentos "unicode" provavelmente são os pesos de classificação e as regras de agrupamento padrão. Os agrupamentos específicos da cultura adaptam os pesos e as regras para serem corretos para essa cultura (quando o padrão estiver incorreto). Para obter mais informações sobre por que existem diferentes agrupamentos, consulte minha resposta à seguinte pergunta SO:
Qual é o objetivo de COLLATIONS para colunas nvarchar (Unicode)?