¿Cómo hacer una búsqueda sensible a mayúsculas y minúsculas en la cláusula WHERE?


21

Quiero búsqueda sensible a mayúsculas y minúsculas en consulta SQL. Pero por defecto, MySQL no considera el caso de las cadenas.

¿Alguna idea sobre cómo hacer una búsqueda sensible a mayúsculas y minúsculas en una consulta SQL?

Respuestas:


22

por defecto, MySQL no considera el caso de las cadenas

Esto no es completamente cierto. Siempre que esté create databaseen MySQL, la base de datos / esquema tiene un conjunto de caracteres y una intercalación. Cada conjunto de caracteres tiene una clasificación predeterminada; ver aquí para más información.

La clasificación predeterminada para el conjunto de caracteres latin1, que es latin1_swedish_ci, no distingue entre mayúsculas y minúsculas.

Puede elegir una intercalación entre mayúsculas y minúsculas, por ejemplo latin1_general_cs( gramática MySQL ):

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;

Esto tiene un efecto en cosas como la agrupación y la igualdad. Por ejemplo,

create table casetable (
  id int primary key, 
  thing varchar(50)
);

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

En una base de datos sensible a mayúsculas y minúsculas, obtenemos:

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| ABC   |        1 |
| aBc   |        1 |
| abC   |        1 |
| abc   |        1 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
+----+-------+

Mientras que en una base de datos que no distingue entre mayúsculas y minúsculas, obtenemos:

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| abc   |        4 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

Tenga en cuenta que también puede cambiar la intercalación desde una consulta . Por ejemplo, en la base de datos sensible a mayúsculas y minúsculas , puedo hacer

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

13

Siempre debe indicar con su pregunta qué versión de MySQL está utilizando, porque MySQL está en constante desarrollo.

Bien, volviendo a tu pregunta:

Las funciones de cadena en MySQL siempre entre mayúsculas y minúsculas, por lo que podría utilizar cualquiera de las funciones LOCATE, POSITIONo INSTR.

Por ejemplo:

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;

El patrón que coincide con la expresión regular ( RLIKEo REGEXP) siempre distingue entre mayúsculas y minúsculas para todas las versiones de MySQL, excepto la 3.23.4 más reciente.

Por ejemplo:

SELECT phone FROM user WHERE user_name REGEXP 'term';

Tanto para la comparación normal (=) como para la coincidencia de patrones SQL ( LIKE), el comportamiento depende de los campos involucrados:

a. CHAR, VARCHARY todas las variantes de los campos de texto se comparan entre mayúsculas y minúsculas.

si. CHAR BINARY, VARCHAR BINARY y todas las variantes de los campos BLOB comparan mayúsculas y minúsculas.

Si compara un campo de (a) con un campo de (b), la comparación será sensible a mayúsculas y minúsculas (la sensibilidad de mayúsculas y minúsculas gana). Consulte el capítulo "7.2.7 Tipos de cadenas" del Manual de referencia de MySQL y busque las declaraciones sobre ordenación y comparaciones.

A partir de V3.23.0, también es posible forzar una comparación entre mayúsculas y minúsculas con el operador de conversión BINARY, independientemente de los tipos de campos involucrados. Consulte el capítulo "7.3.7 Operadores de transmisión" del Manual de referencia de MySQL.

Por lo tanto, también puede cambiar el tipo de nombre de usuario, o con V3.23.x intente algo como:

SELECT phone FROM user WHERE BINARY username LIKE '%term%';

1

En mi situación, estoy usando Access 2010, pero tuve el mismo problema pero la solución es diferente: use la StrComp()función y pruebe que su retorno sea cero.

StrComp( thing, 'abc', 0) = 0

Porque StrComp()devuelve -1si el primer argumento es "más pequeño", 1si es "más grande" y 0si es "igual", cuando StrComp()=0tiene una coincidencia entre mayúsculas y minúsculas.

Mira aquí , aquí o aquí .


0

Esto funcionará en MySQL independientemente del conjunto de caracteres. SELECCIONE 'PRUEBA' REGEXP BINARIO 'PRUEBA' COMO RESULTADO; Poner 'BINARY' obliga a una comparación binaria.


-2

Pruebe esto para una búsqueda insensible, funciona bien con un gran rendimiento:

"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.