¿Cómo puedo buscar (sin distinción entre mayúsculas y minúsculas) en una columna con el comodín LIKE?

289

Miré a mi alrededor y no encontré lo que buscaba, así que aquí va.

SELECT * FROM trees WHERE trees.`title` LIKE  '%elm%'

Esto funciona bien, pero no si el árbol se llama Elm o ELM, etc.

¿Cómo hago que SQL no distinga entre mayúsculas y minúsculas para esta búsqueda con comodines?

Estoy usando MySQL 5 y Apache.

David Morrow
fuente
3
Si tropezó con esta página pero su configuración de MySql funciona en esta consulta para Elm o ELM y BINARY
DESEA que distinga entre
¿No depende de la clasificación de campo / tabla? como 'ut8_general_CI'
Yousha Aleayoub
¿Cómo usarlo sequlize node query?
Ashh
MySQL likedebe ser insensible a mayúsculas y minúsculas por defecto.
Marko Bonaci

Respuestas:

281
SELECT  *
FROM    trees
WHERE   trees.`title` COLLATE UTF8_GENERAL_CI LIKE '%elm%'

En realidad, si agrega COLLATE UTF8_GENERAL_CIa la definición de su columna, puede omitir todos estos trucos: funcionará automáticamente.

ALTER TABLE trees 
 MODIFY COLUMN title VARCHAR(…) CHARACTER 
 SET UTF8 COLLATE UTF8_GENERAL_CI. 

Esto también reconstruirá los índices en esta columna para que puedan usarse para las consultas sin mostrar '%'

Quassnoi
fuente
34
En realidad, si agrega COLLATE UTF8_GENERAL_CIa la definición de su columna, puede omitir todos estos trucos: funcionará automáticamente. ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI. Esto también reconstruirá los índices en esta columna para que puedan usarse para las consultas sin llevar '%'.
Quassnoi
1
ALTER TABLE trees MODIFY COLUMN title VARCHAR (...) esta parece ser la mejor manera, muchas gracias ... dejemos que sql haga el trabajo
David Morrow
10
Recordatorio amistoso de que esta es una respuesta mysql. Si está utilizando PostgreSQL, ILike es la solución a la pregunta anterior.
Steve
2
@RajanRawal: publique su pregunta como una pregunta, no como un comentario. Gracias.
Quassnoi el
1
Esta es la respuesta correcta siempre que su clasificación original sea general, no bin.
greenoldman
261

Siempre he resuelto esto usando lower:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'
cwallenpoole
fuente
47
y uso del índice de botín
su sentido común
3
¿MySQL 5 tiene un operador ILIKE?
Luke Maurer
27
aunque para la búsqueda %% no importa de todos modos :)
Su sentido común
55
@Columna. - Es cierto que esto es menos que ideal para columnas indexadas, pero funcionará para una estructura que ya está en su lugar. También descubrí que las búsquedas que no distinguen entre mayúsculas y minúsculas son más frecuentes en columnas que de todos modos no están indexadas.
cwallenpoole
1
La clasificación predeterminada ya es CI. Entonces, el verdadero problema no está en esta pregunta en particular. Pero sigue siendo la respuesta perfecta al estilo SO.
Su sentido común
48

La distinción entre mayúsculas y minúsculas se define en la configuración de clasificación de columnas / tablas / bases de datos. Puede realizar la consulta en una clasificación específica de la siguiente manera:

SELECT *
FROM trees
WHERE trees.`title` LIKE '%elm%' COLLATE utf8_general_ci

por ejemplo.

(Reemplace utf8_general_cicon cualquier intercalación que encuentre útil). Los _cisoportes para mayúsculas y minúsculas .

aioobe
fuente
1
En MySQL 5.6 obtengo ERROR 1273 (HY000): Clasificación desconocida: 'utf_general_ci' . ¿Supongo que esta recopilación se ha eliminado de MySQL? utf8_general_cifunciona bien, sin embargo.
Mark Amery
1
Tuve el mismo problema. Tienes que arreglar tu COLLATEo hacer un truco simple como este ( LOWER()ambas cadenas antes de la comparación)
Menelaos Kotsollaris
En MySQL 5.6+ o MariaDB 10+ solo necesita proporcionar instrucciones COLLATE antes de su condición. Entonces esto funciona:SELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';
stamster
41

Este es el ejemplo de una simple consulta LIKE:

SELECT * FROM <table> WHERE <key> LIKE '%<searchpattern>%'

Ahora, no distingue entre mayúsculas y minúsculas utilizando la función LOWER ():

SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
Federico Piragua
fuente
3
En realidad, esta es una solución bastante agradable, especialmente cuando se enfrentan COLLATEproblemas de formato
Menelaos Kotsollaris
27

Simplemente use:

"SELECT * FROM `trees` WHERE LOWER(trees.`title`) LIKE  '%elm%'";

O usar

"SELECT * FROM `trees` WHERE LCASE(trees.`title`) LIKE  '%elm%'";

Ambas funciones funcionan igual

Vi8L
fuente
15

Estoy haciendo algo asi

Obtener los valores en minúsculas y MySQL hace el resto

    $string = $_GET['string'];
    mysqli_query($con,"SELECT *
                       FROM table_name
                       WHERE LOWER(column_name)
                       LIKE LOWER('%$string%')");

Y para la alternativa de MySQL PDO:

        $string = $_GET['string'];
        $q = "SELECT *
              FROM table_name
              WHERE LOWER(column_name)
              LIKE LOWER(?);";
        $query = $dbConnection->prepare($q);
        $query->bindValue(1, "%$string%", PDO::PARAM_STR);
        $query->execute();
Dave Doga Oz
fuente
6

Creo que esta consulta hará una búsqueda sin distinción entre mayúsculas y minúsculas:

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
cgupta
fuente
1
Recibo un error de sintaxis en mysql 5.5 mientras uso ILIKE en mis consultas
Steel Brain
18
Esto funciona solo para PostgreSQL; no MySQL postgresql.org/docs/current/static/functions-matching.html
Martin Tournoij
Como ya se señaló, la pregunta era sobre MySQL y la respuesta es sobre PostgreSQL y, por supuesto, no funciona con MySQL. Yo no hacia abajo-voto, pero no puede evitar preguntarse donde la UP-votos provienen de ...
silverdr
5

utilizar ILIKE

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';

me funciono !!

Zarzis ABS
fuente
9
MySQL no es compatible con ILIKE.
ttarchala
3
Eso funciona para PostgreSQL, la pregunta era con respecto a MySQL.
Telmo Trooper
4

No necesitas ALTERninguna mesa. Simplemente use las siguientes consultas, antes de la SELECTconsulta real que desea usar con el comodín:

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;
Lopofsky
fuente
2
Este es un comentario muy subestimado. Aborda la pregunta más generalmente. Creo que la sintaxis de alterar tabla también es importante, ya que la pregunta puede querer que la comparación se limite solo a esa columna.
Brian Chrisman
1

bien en mysql 5.5, como el operador es insensible ... así que si su vale es elm o ELM o Elm o eLM o cualquier otro, y usa como '% elm%', enumerará todos los valores coincidentes.

No puedo decir sobre versiones anteriores de mysql.

Si ingresa en Oracle, le gusta que el trabajo distinga entre mayúsculas y minúsculas, por lo que si escribe como '% elm%', solo se utilizará para esto e ignorará las mayúsculas.

Extraño, pero así es como es :)

usuario21546
fuente
Esto no es del todo cierto. Funciona de esa manera solo si la intercalación se establece en *_ci, que significa "mayúsculas y minúsculas". Como esto es predeterminado para todos los juegos de caracteres admitidos (problema show character set;para verificar esto), la respuesta es parcialmente cierta :-) Solo el motivo es incorrecto. No es el operador el que no distingue entre mayúsculas y minúsculas, sino la clasificación predeterminada.
silverdr
Sí, estoy de acuerdo contigo. Depende del carácter y aún si está en producción con el carácter * _ci, entonces la única opción es usar el binario antes de la cláusula
where
1
SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5 
usuario4189641
fuente
gallery es el nombre de la tabla, name es la columna de la tabla,
user4189641
2
agregue alguna explicación de su código que muestre lo que hace y cómo ayuda; esto ayudará a otros en el futuro
Our Man in Bananas
0

Debe configurar la codificación y la clasificación adecuadas para sus tablas.

La codificación de tabla debe reflejar la codificación de datos real. ¿Cuál es su codificación de datos?

Para ver la codificación de la tabla, puede ejecutar una consulta SHOW CREATE TABLE tablename

Su sentido común
fuente
0

Cuando quiero desarrollar búsquedas de mayúsculas y minúsculas insensibles, siempre convierto cada cadena a minúsculas antes de hacer una comparación

Rbacarin
fuente
0

Puedes usar el siguiente método

 private function generateStringCondition($value = '',$field = '', $operator = '', $regex = '', $wildcardStart = '', $wildcardEnd = ''){
        if($value != ''){
            $where = " $field $regex '$wildcardStart".strtolower($value)."$wildcardEnd' ";

            $searchArray = explode(' ', $value);

            if(sizeof($searchArray) > 1){

                foreach ($searchArray as $key=>$value){
                    $where .="$operator $field $regex '$wildcardStart".strtolower($value)."$wildcardEnd'";
                }

            }

        }else{
            $where = '';
        }
        return $where;
    }

usa este método como a continuación

   $where =  $this->generateStringCondition($yourSearchString,  'LOWER(columnName)','or', 'like',  '%', '%');
  $sql = "select * from table $where";
rey neo
fuente