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?


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.


42

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

'He said, "Don''t!"'

+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.


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'


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%'

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!"

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


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.



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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.