Wynika to z błędu 70767 w LOCATE()
i INSTR()
, który został zweryfikowany.
Chociaż INSTR()
dokumentacja stwierdza, że można go używać do ciągów wielobajtowych, wydaje się, że nie działa, jak zauważyłeś, z sortowaniami takimi jak utf8_general_ci
, który powinien być niewrażliwy na wielkość liter i akcent
Raport o błędzie stwierdza, że chociaż MySQL robi to poprawnie, robi to tylko wtedy, gdy liczba bajtów jest również identyczny:
Aby wypaczyć przykład raportu, jeśli utworzysz następującą tabelę:
create table t ( needle varchar(10), haystack varchar(10)
) COLLATE=utf8_general_ci;
insert into t values ("A", "a"), ("A", "XaX");
insert into t values ("A", "á"), ("A", "XáX");
insert into t values ("Á", "a"), ("Á", "XaX");
insert into t values ("Å", "á"), ("Å", "XáX");
następnie uruchom to zapytanie, możesz zobaczyć to samo zachowanie:
select needle
, haystack
, needle=haystack as `=`
, haystack LIKE CONCAT('%',needle,'%') as `like`
, instr(needle, haystack) as `instr`
from t;