Você estava injetando uma barra invertida literal. Isto é suficiente:
SELECT person_sname
FROM people
WHERE person_sname = 'O\'Brien'
Testar:
SELECT 'O\\\'Brien', 'O\'Brien'
Atualização: Já existe uma resposta aceita, então vou adicionar alguns esclarecimentos.
Primeiro, eu havia esquecido o fato de que os dados armazenados estavam corrompidos. Desnecessário dizer que isso explica por que
person_sname = 'O\\\'Brien'
é verdade. Em segundo lugar, o
\
caractere tem dois usos na sintaxe do MySQL:- É o caractere usado para compor sequências de escape
:
\n
,\t
... - É o caractere de escape padrão para inserir literal
%
e_
caracteres em expressões LIKE :foo LIKE '%abc\%def%'
O problema é que inserir um
\
símbolo em uma expressão LIKE aciona ambos os comportamentos, então você realmente precisa inserir quatro barras invertidas para obter um :person_sname like 'O\\\\\'Brien'
... a menos que você altere o segundo significado com o
ESCAPE
cláusula:person_sname like 'O\\\'Brien' escape '|'
Claro, se os dados não estivessem corrompidos, você poderia simplesmente:
person_sname = 'O\'Brien'
person_sname like 'O\'Brien'