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

Ho guardato in giro alcuni 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 è chiamato Elm o ELM ecc …

Come faccio a rendere insensibile la maiuscola SQL per questa ricerca con caratteri jolly?

Sto usando MySQL 5 e Apache.

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

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

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

Questo ricostruirà anche tutti gli indici su questa colonna in modo che possano essere utilizzati per le query senza ‘%’

L’ho sempre risolto usando più basso:

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

La distinzione tra maiuscole e minuscole è definita nelle colonne / tabelle / impostazioni di confronto del database. Puoi eseguire la query in base a una raccolta specifica nel modo seguente:

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

per esempio.

(Sostituisci utf8_general_ci con qualsiasi collazione che trovi utile). Il _ci sta per insensibile al maiuscolo / minuscolo .

Questo è l’esempio di una semplice query LIKE:

 SELECT * FROM  WHERE  LIKE '%%'

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

 SELECT * FROM  WHERE LOWER() LIKE LOWER('%%')

Sto facendo qualcosa del genere.

Ottenere i valori in lettere minuscole e MySQL fa il resto

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

E per l’alternativa 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(); 

Penso che questa query farà una ricerca insensibile alle maiuscole e minuscole:

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

Basta usare:

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

O usare

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

Entrambe le funzioni funzionano allo stesso modo

Non è necessario ALTER alcun tavolo. Basta utilizzare le seguenti query, prima della query SELECT 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; 

È 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 codifica dei dati?

Per vedere la codifica della tabella, puoi eseguire una query SHOW CREATE TABLE tablename

Quando voglio sviluppare insensitive ricerche di casi, converto sempre ogni stringa in lettere minuscole prima di fare comparazioni

beh in mysql 5.5, l’operatore like è insensibile … quindi se il tuo valore è elm o ELM o Elm o eLM o qualsiasi altro, e si usa come ‘% elm%’, verrà elencato tutti i valori corrispondenti.

Non posso dire delle versioni precedenti di mysql.

Se vai in Oracle, come funziona come case-sensitive, quindi se digiti come ‘% elm%’, andrà solo per questo e ignorerà le maiuscole ..

Strano, ma è così che è 🙂

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