Estabas inyectando una barra invertida literal. Esto es suficiente:
SELECT person_sname
FROM people
WHERE person_sname = 'O\'Brien'
Para probar:
SELECT 'O\\\'Brien', 'O\'Brien'
Actualización: Ya hay una respuesta aceptada, así que agregaré un par de aclaraciones.
Primero, había pasado por alto el hecho de que los datos almacenados estaban dañados. No hace falta decir que eso explica por qué person_sname = 'O\\\'Brien'
es verdad.
En segundo lugar, el \
carácter tiene dos usos en la sintaxis de MySQL:
- Es el carácter utilizado para componer secuencias de escape
:
\n
,\t
... - Es el carácter de escape predeterminado para insertar literal
%
y_
caracteres en expresiones LIKE :foo LIKE '%abc\%def%'
El problema es que insertando un \
El símbolo en una expresión LIKE desencadena ambos comportamientos, por lo que en realidad necesita insertar cuatro barras invertidas para obtener uno :
person_sname like 'O\\\\\'Brien'
... a menos que cambie el segundo significado con ESCAPE
cláusula:
person_sname like 'O\\\'Brien' escape '|'
Por supuesto, si los datos no se corrompieron, simplemente podría:
person_sname = 'O\'Brien'
person_sname like 'O\'Brien'