parcial - hacer un buscarv en mysql
Usando LIKE vs.=para una coincidencia de cadena exacta (2)
En primer lugar, reconozco las diferencias entre los dos:
- Like pone a disposición los comodines% y _
- espacio en blanco significativo al final
- problemas de colación
En igualdad de condiciones, para una coincidencia de cadena exacta que sea más eficiente:
SELECT field WHERE ''a'' = ''a'';
O:
SELECT field WHERE ''a'' LIKE ''a'';
O: ¿Es la diferencia tan insignificante que no importa?
Yo diría que el = comparador sería más rápido. El léxico no envía la comparación a otro sistema léxico para hacer coincidencias generales. En cambio, el motor puede igualar o avanzar. Nuestro db en el trabajo tiene millones de filas y an = siempre es más rápido.
En un DBMS decente, el motor de DB reconocería que no había caracteres comodín en la cadena y lo convertiría implícitamente en una igualdad pura (no necesariamente igual a =
). Por lo tanto, solo obtendría un pequeño golpe de rendimiento al principio, generalmente insignificante para cualquier consulta de tamaño decente.
Sin embargo, el operador MySQL =
no necesariamente actúa de la manera esperada (como una verificación de igualdad pura). Específicamente, no tiene en cuenta por defecto los espacios finales para los datos CHAR
y VARCHAR
, lo que significa que:
SELECT age WHERE name = ''pax''
le dará filas para ''pax''
, ''pax<one space>''
y ''pax<a hundred spaces>''
.
Si desea hacer una verificación de igualdad adecuada , use la palabra clave binary
:
SELECT field WHERE name = binary ''pax''
Puedes probar esto con algo como:
mysql> create table people (name varchar(10));
mysql> insert into people value (''pax'');
mysql> insert into people value (''pax '');
mysql> insert into people value (''pax '');
mysql> insert into people value (''pax '');
mysql> insert into people value (''notpax'');
mysql> select count(*) from people where name like ''pax'';
1
mysql> select count(*) from people where name = ''pax'';
4
mysql> select count(*) from people where name = binary ''pax'';
1