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 binary
operador 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 latin1
conjunto 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 0xE9
pero en utf8
ella es de dos bytes: 0xC3A9
.
¿Por qué usar convert
tan bien como collate
?
Las intercalaciones deben coincidir con el conjunto de caracteres. Entonces, si su servidor o sesión está configurado para usar el latin1
juego de caracteres, debe usarlo, collate latin1_bin
pero 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 convert
y collate
al 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 _ci
intercalació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 binary
operador) hará que las comparaciones de cadenas sean sensibles al acento y a mayúsculas y minúsculas.
¿Qué es utf8mb4
?
El utf8
conjunto de caracteres en MySql es un alias para el utf8mb3
cual 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 utf8mb4
juego de caracteres.