Vous injectiez une barre oblique inverse littérale. Cela suffit :
SELECT person_sname
FROM people
WHERE person_sname = 'O\'Brien'
Pour tester :
SELECT 'O\\\'Brien', 'O\'Brien'
Mise à jour : Il y a déjà une réponse acceptée donc je vais juste ajouter quelques clarifications.
Tout d'abord, j'avais négligé le fait que les données stockées étaient corrompues. Inutile de dire que cela explique pourquoi person_sname = 'O\\\'Brien'
est vrai.
Deuxièmement, le \
Le caractère a deux usages dans la syntaxe MySQL :
- C'est le caractère utilisé pour composer séquences d'échappement
:
\n
,\t
... - C'est le caractère d'échappement par défaut pour insérer le littéral
%
et_
caractères dans les expressions LIKE :foo LIKE '%abc\%def%'
Le problème est que l'insertion d'un \
Le symbole dans une expression LIKE déclenche les deux comportements, vous devez donc en insérer quatre barres obliques inverses pour en obtenir une :
person_sname like 'O\\\\\'Brien'
... sauf si vous changez le deuxième sens avec le ESCAPE
clause :
person_sname like 'O\\\'Brien' escape '|'
Bien entendu, si les données ne sont pas corrompues, vous pouvez simplement :
person_sname = 'O\'Brien'
person_sname like 'O\'Brien'