Cela est dû au bug 70767 sur LOCATE()
et INSTR()
, qui a été vérifié.
Bien que le INSTR()
la documentation indique qu'il peut être utilisé pour les chaînes multi-octets, il ne semble pas fonctionner, comme vous le notez, avec des classements comme utf8_general_ci
, qui doit être insensible à la casse et aux accents
Le rapport de bogue indique que bien que MySQL le fasse correctement, il ne le fait que lorsque le nombre d'octets est également identique :
Pour pervertir l'exemple des rapports, si vous créez le tableau suivant :
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");
puis exécutez cette requête, vous pouvez voir le même comportement démontré :
select needle
, haystack
, needle=haystack as `=`
, haystack LIKE CONCAT('%',needle,'%') as `like`
, instr(needle, haystack) as `instr`
from t;