Tengo una función que devuelve cinco caracteres con mayúsculas y minúsculas. Si hago una consulta en esta cadena, devolverá el valor independientemente del caso.
¿Cómo puedo hacer que las consultas de cadena MySQL distingan entre mayúsculas y minúsculas?
mysql
sql
interop
case-sensitive
string-comparison
StevenB
fuente
fuente
Respuestas:
http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
fuente
SELECT 'email' COLLATE utf8_bin = 'Email'
La buena noticia es que si necesita hacer una consulta entre mayúsculas y minúsculas, es muy fácil de hacer:
fuente
convert(char(0x65,0xcc,0x88) using utf8)
(es decir,e
con¨
agregado) yconvert(char(0xc3,0xab) using utf8)
(es decirë
), pero sumar lasBINARY
hará desiguales.Respuesta publicada por Craig White, tiene una gran penalización de rendimiento
porque no usa índices. Entonces, o bien debe cambiar la clasificación de la tabla como se menciona aquí https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html .
O
La solución más fácil, debe usar un BINARIO de valor.
P.ej.
VS
1 fila en conjunto (0.00 seg)
fuente
En lugar de usar el operador =, es posible que desee usar LIKE o LIKE BINARY
Tomará 'a' y no 'A' en su condición
fuente
Para hacer uso de un índice antes de usar el BINARIO, puede hacer algo como esto si tiene tablas grandes.
La subconsulta daría como resultado un subconjunto de mayúsculas y minúsculas realmente pequeño del cual luego se selecciona la única coincidencia entre mayúsculas y minúsculas.
fuente
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.
¿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 ellatin1
conjunto de caracteres, y su conjunto de caracteres de servidor / sesión lo esutf8mb4
, 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 enlatin1
é se encuentra codificado como el byte0xE9
pero enutf8
ella es de dos bytes:0xC3A9
.¿Por qué usar
convert
tan bien comocollate
?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 esutf8mb4
, debe usarlocollate 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
ycollate
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 elbinary
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 elutf8mb3
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 elutf8mb4
juego de caracteres.fuente
Lo siguiente es para versiones de MySQL iguales o superiores a 5.5.
Añadir a /etc/mysql/my.cnf
Todas las demás colaciones que probé parecían ser sensibles a mayúsculas y minúsculas, solo "utf8_bin" funcionó.
No olvide reiniciar mysql después de esto:
De acuerdo con http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html también hay un "latin1_bin".
El inicio de mysql no aceptó "utf8_general_cs". (Leí "_cs" como "mayúsculas y minúsculas" - ???).
fuente
Puede usar BINARY para mayúsculas y minúsculas como este
desafortunadamente este sql no puede usar el índice, sufrirá un impacto en el rendimiento de las consultas que dependen de ese índice
Afortunadamente, tengo algunos trucos para resolver este problema.
fuente
¡Excelente!
Comparto con ustedes el código de una función que compara las contraseñas:
fuente
declare pSuccess BINARY;
al inicioNo es necesario cambiar nada en el nivel de base de datos, solo tiene que cambiar en la consulta SQL, funcionará.
Ejemplo
"SELECT * FROM <TABLE> where userId = '" + iv_userId + "' AND password = BINARY '" + iv_password + "'";
La palabra clave binaria distingue entre mayúsculas y minúsculas.
fuente
mysql no distingue entre mayúsculas y minúsculas por defecto, intente cambiar la intercalación de idiomas a
latin1_general_cs
fuente