Isso se deve ao bug 70767 em
LOCATE()
e INSTR()
, o que foi verificado. Embora o
INSTR()
a documentação afirma que ele pode ser usado para strings de vários bytes, não parece funcionar, como você observa, com collations como utf8_general_ci
, que não deve diferenciar maiúsculas de minúsculas e acentos O relatório de bug afirma que, embora o MySQL faça isso corretamente, ele só o faz quando o número de bytes também é idêntico:
Para perverter o exemplo de relatórios, se você criar a seguinte tabela:
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");
em seguida, execute esta consulta, você pode ver o mesmo comportamento demonstrado:
select needle
, haystack
, needle=haystack as `=`
, haystack LIKE CONCAT('%',needle,'%') as `like`
, instr(needle, haystack) as `instr`
from t;
SQL Fiddle