Eu tenho duas tabelas, ambas com tipos de dados idênticos, conjuntos de caracteres e agrupamento explicitamente especificados.
CLERK CHAR(3) CHARACTER SET latin1 COLLATE latin1_bin NULL
Para uma junção que diferencia maiúsculas de minúsculas no CLERK
campo, preciso especificar a ordenação na cláusula de junção também ou o fato de ela ser especificada no nível DDL significa que ela não é necessária na junção?
FROM
CUSTOMER S JOIN
CLERK C ON S.CLERK = C.CLERK COLLATE latin1_bin
Resposta simples: Não há necessidade de especificar o agrupamento na consulta. O agrupamento de nível DDL (especialmente quando é o mesmo em ambos os lados e ambos os lados são colunas) será usado (e é por isso que o especificamos no nível DDL em primeiro lugar).
Resposta detalhada: existe uma hierarquia de precedência para qual colação usar em uma determinada operação (concatenação, predicado, etc). O agrupamento usado não depende apenas de ser uma coluna versus um literal, etc., mas também se é Unicode versus não Unicode e até binário versus não binário. A descrição completa pode ser encontrada aqui, Collation Coercibility in Expressions , que é a documentação do MySQL 5.7 já que você está usando essa versão. Uma regra bastante interessante é:
Dito tudo isso, preciso ressaltar que a declaração "os agrupamentos binários diferenciam maiúsculas de minúsculas", embora extremamente comum, é definitivamente incorreta.
Em um nível muito básico, a classificação é diferente. Os agrupamentos que diferenciam maiúsculas de minúsculas classificarão "a" com "A" (embora o que vem primeiro pode depender da cultura), "b" com "B" e assim por diante. Os agrupamentos binários serão classificados de acordo com o valor subjacente/ponto de código de cada caractere, o que se torna muito aparente quando as versões maiúsculas e minúsculas de um caractere são separadas por outras de acordo com seu valor.
Ser "sensível a maiúsculas" significa que você também pode ser "INsensível" a outras propriedades de caracteres, sendo a principal acentos. Essa também é a única outra propriedade quando se trata de conjuntos de caracteres não Unicode, mas o Unicode permite a sensibilidade do tipo Kana, a sensibilidade da largura e o SQL Server (a partir da versão 2017) permite até a sensibilidade do seletor de variação. Os agrupamentos binários não permitem que um caractere seja igual a nada além de si mesmo, mesmo que existam outras formas dele. Novamente, isso não acontece muito em conjuntos de caracteres não Unicode, mas em Unicode pode haver várias versões de um caractere, incluindo amplo, sobrescrito, subscrito, itálico, de cabeça para baixo (referido como "virado"), etc. . MySQL, começando na versão 8.0 (até onde eu sei),
ut8mb4
conjunto de caracteres e agrupamentos):Para ilustrar esses dois pontos, configurei uma demonstração no incrível db<>fiddle . Eu tive que usar o MySQL 8.0 não apenas para obter o
_ai_ci
agrupamento, mas também porque aCOLLATE latin1_general_ci
cláusula (2ª à última consulta, #5) não teve nenhum efeito (por algum motivo estranho; a documentação afirma que quando o nome do agrupamento tem apenas_ci
, então_ai
está implícito, ainda para MySQL 5.6 e 5.7 em db<>fiddle , o comportamento ainda é_as_cs
ou_bin
).E há ainda outras maneiras pelas quais os agrupamentos binários não diferenciam maiúsculas de minúsculas. Não podem contabilizar:
Eu não listei ou forneci exemplos para eles anteriormente porque eles não pertencem a codificações de 8 bits e
latin1
são uma codificação de 8 bits. Esses são recursos do Unicode e, portanto, devem ser aplicados a qualquer agrupamento Unicode (embora eu não os tenha testado no MySQL, mas eles são implementados corretamente no SQL Server).PS Eu tenho uma explicação detalhada de tudo isso (incluindo os comportamentos específicos do Unicode observados diretamente acima) no seguinte post: Não, os agrupamentos binários não são sensíveis a maiúsculas e minúsculas . Atualmente, isso está enquadrado apenas no contexto do SQL Server, mas posso trabalhar no exemplo que criei para essa resposta quando tiver tempo. O importante é que o conceito seja o mesmo em todos os RDBMSs.
Para referência (caso db<>fiddle esteja inacessível), as consultas são:
Consulta 1
Consulta 2
Consulta 3
Consulta 4
Consulta 5
Consulta 6
Consulta 7
Consulta 8
Consulta 9
Consulta 10