Próbowałem dowiedzieć się, w jaki sposób mogę wykonać zapytanie za pomocą MySQL, które sprawdza, czy wartość (ciąg $haystack
) w określonej kolumnie zawiera określone dane (ciąg $needle
), takie jak:
mysql_query("
SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')
");
W PHP funkcja jest wywoływana substr($haystack, $needle)
, więc może:
WHERE substr(`column`, '{$needle}')=1
php
mysql
sql
string-comparison
arik
źródło
źródło
column LIKE '...'
tym nie rozróżnia wielkości liter, zcolumn LIKE BINARY '...'
tym jest rozróżnianaLIKE
zaproponowano sprawdzenie podciągu, ponieważ ten operator używa dwóch znaków wieloznacznych:%
i_
. Oznacza to, że jeśli igła $ ciągu zawiera jeden z tych znaków specjalnych, wówczas wyniki nie są zgodne z oczekiwaniami. (-1) dla tej odpowiedzi i (+1) dla odpowiedzi INSTR.Posługiwać się:
Odniesienie:
źródło
LIKE %...%
nie użyje indeksu, jeśli jest obecny, więc powinny być równoważne;LIKE ...%
użyłby indeksu, jeśli jest obecny. Jeśli wydajność stanowi poważny problem, lepszym rozwiązaniem byłoby wyszukiwanie pełnotekstowe (FTS).like
operatorem. Zinstr
frazą można zamówić w ten sposóbselect * from table order by instr(col1,"mystring")
źródło
Mój używa
LOCATE
w mysql:Ta funkcja jest bezpieczna dla wielu bajtów i rozróżnia małe i wielkie litery tylko wtedy, gdy co najmniej jeden argument jest łańcuchem binarnym.
W Twoim przypadku:
źródło
Oprócz odpowiedzi z @WoLpH.
Korzystając ze
LIKE
słowa kluczowego, możesz również ograniczyć kierunek, w którym pasuje ciąg. Na przykład:Jeśli szukasz ciągu rozpoczynającego się od
$needle
:Jeśli szukałeś ciągu, który kończy się na
$needle
:źródło
pamiętaj, że jest to niebezpieczne:
Ty pierwszy:
zapobiegnie to możliwym atakom.
źródło
mysql_real_escape_string
będzie przestarzałe w przyszłych wersjach PHP.$stmt = $dbh->prepare("Where 'column' LIKE '{:needle}'"); $stmt->bindParam(':needle', $needle); $stmt->execute();
Prawdopodobnie szukasz
find_in_set
funkcji:Ta funkcja działa jak
in_array
funkcja w PHPźródło