La forma más correcta de realizar una comparación de cadenas entre mayúsculas y minúsculas sin cambiar la clasificación de la columna que se consulta es especificar explícitamente un conjunto de caracteres y clasificación para el valor con el que se compara la columna.
select * from `table` where `column` = convert('value' using utf8mb4) collate utf8mb4_bin;
¿Por qué no usar binary?
El uso del binaryoperador no es aconsejable porque compara los bytes reales de las cadenas codificadas. Si compara los bytes reales de dos cadenas codificadas usando los diferentes juegos de caracteres, dos cadenas que deben considerarse iguales pueden no ser iguales. Por ejemplo, si tiene una columna que usa el latin1conjunto de caracteres, y su conjunto de caracteres de servidor / sesión lo es utf8mb4, cuando compara la columna con una cadena que contiene un acento como 'café', ¡no coincidirá con las filas que contienen esa misma cadena! Esto es debido a que en latin1é se encuentra codificado como el byte 0xE9pero en utf8ella es de dos bytes: 0xC3A9.
¿Por qué usar converttan bien como collate?
Las intercalaciones deben coincidir con el conjunto de caracteres. Entonces, si su servidor o sesión está configurado para usar el latin1juego de caracteres, debe usarlo, collate latin1_binpero si su juego de caracteres es utf8mb4, debe usarlo collate utf8mb4_bin. Por lo tanto, la solución más sólida es convertir siempre el valor en el conjunto de caracteres más flexible y utilizar la intercalación binaria para ese conjunto de caracteres.
¿Por qué aplicar el converty collateal valor y no la columna?
Cuando aplica cualquier función de transformación a una columna antes de hacer una comparación, evita que el motor de consulta use un índice si existe para la columna, lo que podría ralentizar drásticamente su consulta. Por lo tanto, siempre es mejor transformar el valor donde sea posible. Cuando se realiza una comparación entre dos valores de cadena y uno de ellos tiene una clasificación explícitamente especificada, el motor de consulta utilizará la clasificación explícita, independientemente del valor al que se aplique.
Sensibilidad acento
Es importante tener en cuenta que MySql no solo distingue entre mayúsculas y minúsculas para las columnas que usan una _ciintercalación (que generalmente es la predeterminada), sino que también es insensible al acento . Esto significa que 'é' = 'e'. El uso de una intercalación binaria (o el binaryoperador) hará que las comparaciones de cadenas sean sensibles al acento y a mayúsculas y minúsculas.
¿Qué es utf8mb4?
El utf8conjunto de caracteres en MySql es un alias para el utf8mb3cual ha sido desaprobado en las versiones recientes porque no admite caracteres de 4 bytes (lo cual es importante para codificar cadenas como 🐈). Si desea usar la codificación de caracteres UTF8 con MySql, entonces debería estar usando el utf8mb4juego de caracteres.