W przyzwoitym systemie DBMS silnik bazy danych rozpoznałby, że nie ma znaków wieloznacznych w łańcuchu i niejawnie przekształcił go w czystą równość (niekoniecznie taki sam jak =
). Tak więc na początku uzyskasz tylko małe trafienie wydajnościowe, zazwyczaj pomijalne w przypadku każdego przyzwoitego zapytania.
Jednak operator MySQL =
niekoniecznie zachowuje się tak, jak tego oczekujesz (jako czysta kontrola równości). W szczególności, nie domyślnie uwzględnia spacje dla CHAR
i VARCHAR
danych, co oznacza, że:
SELECT age WHERE name = 'pax'
daje wiersze dla 'pax'
, 'pax<one space>'
i'pax<a hundred spaces>'
.
Jeśli chcesz zrobić właściwą kontrolę równości, należy użyć binary
kluczowe:
SELECT field WHERE name = binary 'pax'
można przetestować to z czymś takim:
mysql> create table people (name varchar(10));
mysql> insert into people value ('pax');
mysql> insert into people value ('pax ');
mysql> insert into people value ('pax ');
mysql> insert into people value ('pax ');
mysql> insert into people value ('notpax');
mysql> select count(*) from people where name like 'pax';
1
mysql> select count(*) from people where name = 'pax';
4
mysql> select count(*) from people where name = binary 'pax';
1
odsłaniając zupełnie braindead Wdrożenie, koszt smaku porównywania łańcuchów będzie obniżony o koszt przeniesienia danych z dysku. Napisz, co naprawdę masz na myśli i zajmij się programowaniem. –
To zostało wcześniej omówione [tutaj] (http://stackoverflow.com/questions/543580/equals-vs-like) na stackoverflow. Mam nadzieję, że to pomoże. – user34867
Dzięki, szukałem tego przed wysłaniem, ale nie widziałem tego w jakiś sposób. – mluebke