A maneira mais correta de executar uma comparação de cadeias com distinção entre maiúsculas e minúsculas sem alterar o agrupamento da coluna que está sendo consultada é especificar explicitamente um conjunto de caracteres e agrupamento para o valor ao qual a coluna está sendo comparada.
select * from `table` where `column` = convert('value' using utf8mb4) collate utf8mb4_bin;
Por que não usar binary
?
O uso do binary
operador é desaconselhável, pois compara os bytes reais das seqüências codificadas. Se você comparar os bytes reais de duas cadeias codificadas usando o conjunto de caracteres diferentes, duas cadeias que devem ser consideradas iguais podem não ser iguais. Por exemplo, se você possui uma coluna que usa o latin1
conjunto de caracteres e seu servidor / sessão é utf8mb4
, quando você compara a coluna com uma sequência que contém um acento como 'café', ela não corresponde às linhas que contêm a mesma sequência! Isto porque, em latin1
E é codificado como o byte 0xE9
, mas em utf8
que é dois bytes: 0xC3A9
.
Por que usar convert
tão bem quanto collate
?
Os agrupamentos devem corresponder ao conjunto de caracteres. Portanto, se seu servidor ou sessão estiver configurado para usar o latin1
conjunto de caracteres, você deve usar, collate latin1_bin
mas se seu conjunto de caracteres estiver, utf8mb4
deverá usar collate utf8mb4_bin
. Portanto, a solução mais robusta é sempre converter o valor no conjunto de caracteres mais flexível e usar o agrupamento binário para esse conjunto de caracteres.
Por que aplicar o convert
e collate
ao valor e não à coluna?
Quando você aplica qualquer função de transformação a uma coluna antes de fazer uma comparação, impede que o mecanismo de consulta use um índice, se houver algum para a coluna, o que poderia diminuir drasticamente a sua consulta. Portanto, é sempre melhor transformar o valor sempre que possível. Quando uma comparação é realizada entre dois valores de sequência e um deles possui um agrupamento especificado explicitamente, o mecanismo de consulta usará o agrupamento explícito, independentemente de qual valor é aplicado.
Sensibilidade ao acento
É importante observar que o MySql não apenas diferencia maiúsculas de minúsculas para colunas usando um _ci
agrupamento (que normalmente é o padrão), mas também não diferencia sotaque . Isso significa isso 'é' = 'e'
. O uso de um agrupamento binário (ou o binary
operador) fará com que as comparações de string sejam sensíveis ao acento e também ao caso.
O que é utf8mb4
?
O utf8
conjunto de caracteres no MySql é um alias utf8mb3
que foi descontinuado nas versões recentes porque não suporta caracteres de 4 bytes (o que é importante para a codificação de strings como 🐈). Se você deseja usar a codificação de caracteres UTF8 com o MySql, deve usar o utf8mb4
charset.