Como escapar do apóstrofo (') no MySql?

147

A documentação do MySQL diz que deveria ser \'. No entanto, scite e mysql mostram que ''funciona. Eu vi isso e funciona. O que devo fazer?

user4951
fonte
Você está falando se está correto ''ou não \'?
Raptor
\'é MySQL específico, enquanto ''é compatível com ANSI SQL, se não me engano
apokryfos
Dependendo da implementação do SQL; - '' \ '', '\' 'e algumas vezes' [']' 'permitirão uma quebra do código. Além disso, qualquer número de substituições unicode 'ignorará essa verificação. O jogo inteiro aqui está abusando da qualidade do escape baseado em '' que exige que a contagem final 'seja par e não estranha. Se isso acabar estranho, misturando vários métodos de escape um no outro, você poderá derrotar o SQL bruto e de escape. Moral da história: NUNCA use interpolação de cordas, SEMPRE use declarações preparadas.
precisa

Respostas:

186

A documentação do MySQL que você cita realmente diz um pouco mais do que você menciona. Também diz:

Um " '" dentro de uma sequência citada com "' " pode ser escrito como " ''".

(Além disso, você vinculou à versão MySQL 5.0 da Tabela 8.1. Sequências de escape de caracteres especiais e a versão atual é 5.6 - mas a tabela 8.1 atual . Sequências de escape de caracteres especiais são bastante semelhantes.)

Eu acho que a notabackslash_quote (string) do Postgres no parâmetro é informativa:

Isso controla se uma aspas pode ser representada por \'em uma string literal. A maneira preferida e padrão do SQL para representar uma aspas é dobrando-a ('' ), mas o PostgreSQL também historicamente também aceitou \'. No entanto, o uso de \'cria riscos à segurança ...

Isso me diz que usar um caractere de aspas simples duplicado é uma escolha geral e de longo prazo melhor do que usar uma barra invertida para escapar da aspas simples.

Agora, se você também quiser adicionar opções de linguagem, escolha do banco de dados SQL e suas peculiaridades não padrão e escolha da estrutura de consulta à equação, poderá ter uma escolha diferente. Você não fornece muita informação sobre suas restrições.

Jim DeLaHunt
fonte
42

O SQL padrão usa aspas dobradas; O MySQL precisa aceitar isso para ser razoavelmente compatível.

'He said, "Don''t!"'
Jonathan Leffler
fonte
+1. Onde ele diz que ele deve ser escapado por "" não dev.mysql.com/doc/refman/5.0/en/…
user4951
Ele diz 'pode' em vez de 'deveria', mas as informações estão lá (abaixo da tabela): Existem várias maneiras de incluir caracteres de citação em uma sequência: Um " '" dentro de uma sequência citada com " '" pode ser escrito como " ''" . Um " "" dentro de uma string citada com " "" pode ser escrito como " """. Preceda o caractere de citação com um caractere de escape ("` `").
27614 Jonathan
1
Esta é a melhor maneira de escapar do apóstrofo, duplicando-o.
21880 Alex_TNT
10

O que eu acredito que user2087510 significava era:

name = 'something'
name = name.replace("'", "\\'")

Eu também usei isso com sucesso.

user3169788
fonte
1
Trabalhou para mim enquanto as principais respostas não
Jared
1
por que \\ 'em vez de \'?
Biniam
@biniam_Ethiopia a segunda \ escapa o primeiro
Juha Untinen
2
possível problema de segurança. pode obter injeção de sql se a string já contiver \ ', então você insere um \, que agora está na string como \\', que terminará a string. Use name.replace ("'", "' '") em vez disso
Garr Godfrey
6

basta escrever ''no lugar de 'quero dizer duas vezes'

MRRaja
fonte
1
usar apóstrofo duas vezes no lugar de um
MRRaja
5

Aqui está um exemplo:

SELECT * FROM pubs WHERE name LIKE "%John's%"

Basta usar aspas duplas para incluir a aspas simples.

Se você insistir em usar aspas simples (e a necessidade de escapar do personagem):

SELECT * FROM pubs WHERE name LIKE '%John\'s%'
Overkillica
fonte
4

Existem três maneiras pelas quais estou ciente. O primeiro não é o mais bonito e o segundo é o caminho comum na maioria das linguagens de programação:

  1. Use outra citação única: 'I mustn''t sin!'
  2. Use o caractere de escape \antes da citação simples ':'I mustn\'t sin!'
  3. Use aspas duplas para colocar a string em vez de aspas simples: "I mustn't sin!"
Robert Rocha
fonte
Minha preferência pessoal seria a de \'que é usada por muitas linguagens de programação, mas ''é suportada por mais dialetos SQL; portanto, usar a opção 1 é melhor para compatibilidade. O sqlite, por exemplo, não funciona com escapes de barra invertida.
Okdowit 06/12
0

Substitua a sequência

value = value.replace(/'/g, "\\'");

onde value é sua string que será armazenada em seu banco de dados.

Mais distante,

Pacote NPM para isso, você pode dar uma olhada nele

https://www.npmjs.com/package/mysql-apostrophe

Ashutosh Jha
fonte
Não basta postar alguma ferramenta ou biblioteca como resposta. Pelo menos demonstre como ele resolve o problema na própria resposta.
Baum mit Augen
Isso não vai funcionar. Você esqueceu de escapar das coisas. substituir (/ \ '/ g, "\\\'")
Michael
0

Eu acho que se você tiver algum ponto de dados com apóstrofo, você pode adicionar um apóstrofo antes do apóstrofo

por exemplo. 'Este é o lar de João'

Aqui o MYSQL assume duas frases 'Este é o lugar de John'

Você pode colocar 'Este é o lugar de John'. Eu acho que deveria funcionar assim.

Priyanka Pandhi
fonte
0

Possivelmente fora de tópico, mas talvez você tenha vindo aqui procurando uma maneira de higienizar a entrada de texto de um formulário HTML, para que, quando um usuário insira o caractere apóstrofo, ele não gere um erro ao tentar gravar o texto em um SQL tabela baseada em um banco de dados. Existem algumas maneiras de fazer isso, e você também pode querer ler sobre injeção de SQL, mas uma opção simples no PHP é usar a função htmlspecialchars () que converterá todos os seus apóstrofos nos 'quais é possivelmente o que você deseja armazenar de qualquer forma.

Grindlay
fonte
Codificação não é para armazenamento, é para exibição. Use declarações preparadas.
mickmackusa
Concordo que as declarações preparadas são o padrão-ouro para segurança e confiabilidade. Eu estava destacando um caso específico em que você pode querer armazenar dados de texto como HTML; nesse caso, meu método é além de usar parâmetros vinculados, em vez de em vez de. Entrada HTML, saída HTML.
Grindlay