La stringa di query MySQL contiene


307

Ho cercato di capire come posso fare una query con MySQL che controlla se il valore (stringa $haystack) in una determinata colonna contiene determinati dati (stringa $needle), come questo:

mysql_query("
SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')
");

In PHP, la funzione è chiamata substr($haystack, $needle), quindi forse:

WHERE substr(`column`, '{$needle}')=1

Risposte:


437

Abbastanza semplice in realtà:

mysql_query("
SELECT *
FROM `table`
WHERE `column` LIKE '%{$needle}%'
");

Il %è un jolly per eventuali caratteri impostati (nessuno, uno o molti). Si noti che questo può rallentare su set di dati molto grandi, quindi se il database cresce, è necessario utilizzare indici full-text.


1
Funzionerà solo se stai usando una query preparata. Se stai usando una stringa reale (es. Script di aggiornamento liquibase sql), considera INSTR menzionato di seguito). Questo perché se la tua stringa contiene un%, inizierai a far coincidere le cose con esso.
Ryan Shillington,

2
conosco le query come, eppure oggi volevo scoprire se esiste un certo valore nella stringa in qualche colonna, stavo cercando su Google ... Perché non ci avevo mai pensato prima ??
Frizzante Codice

1
è sensibile al maiuscolo / minuscolo?
kiwi arrabbiato,

2
@angry_kiwi: con column LIKE '...'la distinzione tra maiuscole e minuscole, con column LIKE BINARY '...'distinzione tra maiuscole
Wolph

2
Sono sorpreso che LIKEvenga proposto di verificare la presenza di sottostringhe poiché questo operatore utilizza due caratteri jolly: %e _. Ciò significa che se la tua stringa $ ago contiene uno di questi caratteri speciali, i risultati non sono affatto quelli previsti. (-1) per questa risposta e (+1) per la risposta INSTR.
Skrol29,

144

Uso:

SELECT *
  FROM `table`
 WHERE INSTR(`column`, '{$needle}') > 0

Riferimento:


sicuramente LIKE è più veloce di INSTR?
chris,

17
@oedo: dipende. LIKE %...%non utilizzerà un indice se ne è presente uno, quindi dovrebbero essere equivalenti; LIKE ...%userebbe un indice se presente. Se le prestazioni sono una vera preoccupazione, la ricerca full text (FTS) sarebbe un approccio migliore.
OMG Pony

Perfetto. proprio quello che stavo cercando.
arik

2
Mi piace questa soluzione poiché in realtà non c'è modo di ordinare le cose in base alla presenza di una sottostringa con likeoperatore. Con instruna frase può essere ordinato in questo modoselect * from table order by instr(col1,"mystring")
Radacina

Volevo cercare _ in un campo e ha funzionato. Grazie
Safeer Ahmed,

53
WHERE `column` LIKE '%$needle%'

2
durante la ricerca del carattere _ (trattino basso) la query LIKE '% _%' non funziona, per qualche motivo restituisce tutte le stringhe anche senza _
Wojtek,

1
@Wojtek _ è un carattere jolly per ogni singolo carattere, quindi se vuoi cercare un carattere di sottolineatura letterale dovrai evitarlo. Vedi query MySQL LIKE con trattino basso .
jkmartindale,

29

Il mio sta usando LOCATEin mysql:

LOCATE (substr, str), LOCATE (substr, str, pos)

Questa funzione è sicura per più byte ed è sensibile al maiuscolo / minuscolo solo se almeno un argomento è una stringa binaria.

Nel tuo caso:

mysql_query("
SELECT * FROM `table`
WHERE LOCATE('{$needle}','column') > 0
");

11
'colonna' dovrebbe essere colonna (senza virgolette)
Wojtek,

10

Oltre alla risposta di @WoLpH.

Quando si utilizza il LIKE parola chiave hai anche la possibilità di limitare la direzione in cui la stringa corrisponde. Per esempio:

Se stavi cercando una stringa che inizia con $needle:

... WHERE column LIKE '{$needle}%'

Se stavi cercando una stringa che termina con $needle:

... WHERE column LIKE '%{$needle}'

3

essere consapevoli del fatto che questo è pericoloso:

WHERE `column` LIKE '%{$needle}%'

fare prima:

$needle = mysql_real_escape_string($needle);

quindi eviterà possibili attacchi.


7
* Alcuni possibili attacchi. Inoltre, mysql_real_escape_stringsarà deprecato nelle future versioni di PHP.
Jack Tuck,

11
Dovresti usare istruzioni preparate e lasciare l'escaping a PHP. $stmt = $dbh->prepare("Where 'column' LIKE '{:needle}'"); $stmt->bindParam(':needle', $needle); $stmt->execute();
Cloudworks

3

Probabilmente stai cercando una find_in_setfunzione:

Where find_in_set($needle,'column') > 0

Questa funzione si comporta come una in_arrayfunzione in PHP

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.