Mysql
 sql >> Base de données >  >> RDS >> Mysql

INSTR(str,substr) ne fonctionne pas lorsque str contient 'é' ou 'ë' et substr uniquement 'e'

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;

SQL Fiddle