Come posso cercare (senza distinzione tra maiuscole e minuscole) in una colonna usando il jolly LIKE?


289

Mi sono guardato intorno e non ho trovato quello che cercavo, quindi ecco qui.

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

Funziona bene, ma non se l'albero si chiama Elm o ELM ecc ...

Come faccio a non distinguere tra maiuscole e minuscole per questa ricerca con caratteri jolly?

Sto usando MySQL 5 e Apache.


3
Se si inciampato su questa pagina, ma le impostazioni MySql funzionano su questa query per Elm o ELM e si desidera che sia maiuscole e minuscole, vedi BINARYad esempio qui: stackoverflow.com/questions/7857669/...
joshuahedlund

Non dipende dal confronto tra campi / tabelle? come 'ut8_general_CI'
Yousha Aleayoub

Come usarlo sequlize nodo query?
Ashh,

Per likeimpostazione predefinita, MySQL dovrebbe distinguere tra maiuscole e minuscole.
Marko Bonaci,

Risposte:


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

In realtà, se aggiungi COLLATE UTF8_GENERAL_CIalla definizione della tua colonna, puoi semplicemente omettere tutti questi trucchi: funzionerà automaticamente.

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

Ciò ricostruirà anche tutti gli indici su questa colonna in modo che possano essere utilizzati per le query senza portare '%'


34
In realtà, se aggiungi COLLATE UTF8_GENERAL_CIalla definizione della tua colonna, puoi semplicemente omettere tutti questi trucchi: funzionerà automaticamente. ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI. Ciò ricostruirà anche tutti gli indici su questa colonna in modo che possano essere utilizzati per le query senza portare "%".
Quassnoi,

1
ALTER TABLE trees MODIFICA COLONNA titolo VARCHAR (...) questo sembra il modo migliore, grazie mille ... lascia che sql faccia il lavoro
David Morrow

10
Amichevole promemoria che questa è una risposta mysql. Se stai usando PostgreSQL, ILike è la soluzione alla domanda sopra.
Steve,

2
@RajanRawal: pubblica la domanda come domanda, non come commento. Grazie.
Quassnoi,

1
Questa è una risposta corretta, purché la tua fascicolazione originale fosse generale, non bin.
Greenoldman,

261

Ho sempre risolto questo usando inferiore:

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

47
e rovinare l'uso dell'indice
Il tuo senso comune

3
MySQL 5 ha un operatore ILIKE?
Luke Maurer,

27
anche se per la ricerca %% non importa comunque :)
Il tuo buon senso

5
@Col. - Certo, questo non è l'ideale per le colonne indicizzate, ma funzionerà per una struttura che è già in atto. Ho anche scoperto che le ricerche senza distinzione tra maiuscole e minuscole sono più spesso su colonne che non sono comunque indicizzate.
cwallenpoole,

1
Le regole di confronto predefinite sono già CI. Quindi, il vero problema non è in questa domanda particolare. Ma è ancora una risposta in perfetto stile SO.
Il tuo buon senso

48

La distinzione tra maiuscole e minuscole è definita nelle impostazioni di confronto colonne / tabelle / database. È possibile eseguire la query in un confronto specifico nel modo seguente:

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

per esempio.

(Sostituisci utf8_general_cicon qualsiasi fascicolo che ritieni utile). È l' _ciacronimo di case insensitive .


1
In MySQL 5.6 ottengo ERROR 1273 (HY000): regole di confronto sconosciute: 'utf_general_ci' . Immagino che questo confronto sia stato rimosso da MySQL? utf8_general_cifunziona bene, però.
Mark Amery,

1
Aveva lo stesso problema. O devi riparare il tuo COLLATEo fare un semplice trucco come questo ( LOWER()entrambe le corde prima del confronto)
Menelaos Kotsollaris

In MySQL 5.6+ o MariaDB 10+ è sufficiente fornire le istruzioni COLLATE prima delle proprie condizioni. Quindi funziona:SELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';
criceto

41

Questo è l'esempio di una semplice query LIKE:

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

Ora, senza distinzione tra maiuscole e minuscole utilizzando LOWER () func:

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

3
In realtà questa è una soluzione molto carina, specialmente quando si affrontano COLLATEproblemi di formato
Menelaos Kotsollaris,

27

Usa semplicemente:

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

O utilizzare

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

Entrambe le funzioni funzionano allo stesso modo


15

Sto facendo qualcosa del genere.

Ottenere i valori in minuscolo e MySQL fa il resto

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

E per MySQL DOP Alternativa:

        $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();

6

Penso che questa query farà una ricerca senza distinzione tra maiuscole e minuscole:

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

1
Ottengo un errore di sintassi su mysql 5.5 mentre utilizzo ILIKE nelle mie query
Steel Brain


Come già notato, la domanda riguardava MySQL e la risposta riguarda PostgreSQL e sicuramente non funziona con MySQL. Non lo faccio sottovalutare ma non posso fare a meno di chiedermi da dove provengano i voti
positivi

5

uso ILIKE

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

ha funzionato per me !!


9
MySQL non supporta ILIKE.
ttarchala,

3
Funziona con PostgreSQL, la domanda riguardava MySQL.
Telmo Trooper,

4

Non è necessario ALTERalcun tavolo. Basta utilizzare le seguenti query, prima della SELECTquery effettiva che si desidera utilizzare il carattere jolly:

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;

2
Questo è un commento molto sottovalutato. Si rivolge alla domanda più in generale. Penso che anche la sintassi dell'alter table sia importante, in quanto la domanda potrebbe voler limitare il confronto a quella sola colonna.
Brian Chrisman,

1

bene in mysql 5.5, come l'operatore è insensibile ... quindi se il tuo vale è elm o ELM o Elm o eLM o qualsiasi altro, e usi come '% elm%', elencherà tutti i valori corrispondenti.

Non posso dire delle versioni precedenti di mysql.

Se vai in Oracle, ad esempio lavora come sensibile al maiuscolo / minuscolo, quindi se digiti come '% elm%', andrà solo per questo e ignorerà le maiuscole ..

Strano, ma è così :)


Questo non è del tutto vero. Funziona in questo modo solo se il confronto è impostato su *_ci, che significa "insensibile alle maiuscole / minuscole". Poiché ciò risulta essere predefinito per tutti i set di caratteri supportati (problema show character set;da verificare), la risposta è parzialmente vera :-) Solo il motivo è errato. Non è l'operatore che non fa distinzione tra maiuscole e minuscole, è la collazione predefinita che lo è.
Silverdr,

si sono d'accordo con te. Dipende dal carattere e comunque se sei in produzione con il carattere * _ci, l'unica opzione è usare la binaria prima della clausola where
user21546

1
SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5 

gallery è il nome della tabella, il nome è la colonna nella tabella,
user4189641

2
per favore, aggiungi qualche spiegazione del tuo codice che mostra cosa fa e come aiuta - questo aiuterà gli altri in futuro
Our Man in Bananas,

0

È necessario impostare la codifica e le regole di confronto appropriate per le tabelle.

La codifica della tabella deve riflettere la codifica dei dati effettiva. Qual è la tua codifica dei dati?

Per visualizzare la codifica della tabella, è possibile eseguire una query SHOW CREATE TABLE tablename


0

Quando voglio sviluppare ricerche di maiuscole e minuscole, converto sempre ogni stringa in lettere minuscole prima di fare una comparazione


0

Puoi usare il seguente metodo

 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 questo metodo come di seguito

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.