Como escapar de aspas simples no MySQL


Respostas:


126

Simplificando:

SELECT 'This is Ashok''s Pen.';

Portanto, dentro da string, substitua cada aspa simples por duas delas.

Ou:

SELECT 'This is Ashok\'s Pen.'

Escape it =)


9
Você pode querer atualizar sua postagem para incluir mysql_real_escape_string () ou addslashes () como soluções possíveis ... como em um dos comentários abaixo, o OP afirma que eles estão apenas lendo o arquivo e inserindo.
James B de

3
Os métodos mysql_ * não são recomendados para uso futuro, pois estão obsoletos .
hd1

Essa é a resposta certa, embora atualmente a melhor opção seja usar um dos
Ryan

10

'é o caractere de escape. Portanto, sua string deve ser:

Esta é a caneta de Ashok

Se você estiver usando algum código de front-end, precisará fazer uma substituição de string antes de enviar os dados para o procedimento armazenado.

Por exemplo, em C # você pode fazer

value = value.Replace("'", "''");

e, em seguida, passe o valor para o procedimento armazenado.


Não estou inserindo dados manualmente, eu extraio de Arquivo, e haverá vaklues: a caneta de Ashok. Como inserir. criou um procedimento para fazer isso .. como torná-lo correto.
Ashok Gupta

FWIW menor nit: barra invertida é "o caractere de escape"; ''(duas aspas simples) é uma alternativa especial permitida para "escapar" de um caractere de aspas simples.
ToolmakerSteve

9

Veja minha resposta para "Como escapar caracteres no MySQL"

Qualquer biblioteca que você estiver usando para conversar com o MySQL terá uma função de escape embutida, por exemplo, no PHP você pode usar mysqli_real_escape_string ou PDO :: quote


1
Não estou inserindo dados manualmente, eu extraio de Arquivo, e haverá valores: caneta de Ashok. Como inserir. criou um procedimento para fazer isso .. como corrigi-lo.
Ashok Gupta

Apenas uma nota This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.,.
NewBee

7

Se você usar instruções preparadas, o driver tratará de qualquer escape. Por exemplo (Java):

Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
    prepped.setString(1, line);
    prepped.executeQuery();
}
conn.commit();
conn.close();

7

Use este código:

<?php
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

Isso resolverá seu problema, porque o banco de dados não consegue detectar os caracteres especiais de uma string.


1
Apenas uma nota This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.,.
NewBee

6

Existe outra maneira de fazer isso que pode ou não ser mais segura, dependendo da sua perspectiva. Requer MySQL 5.6 ou posterior devido ao uso de uma função de string específica:FROM_BASE64 .

Digamos que você tenha esta mensagem que gostaria de inserir:

"Ah", Nick Quase Sem Cabeça acenou com a mão elegante, "uma questão sem importância ... Não é como se eu realmente quisesse entrar ... Pensei em me inscrever, mas aparentemente não cumpro os requisitos. '- "

Essa citação tem um monte de aspas simples e duplas e seria muito chato inserir no MySQL. Se você estiver inserindo isso de um programa, é fácil escapar das aspas, etc. Mas, se você tiver que colocar isso em um script SQL, você terá que editar o texto (para escapar das aspas) que pode estar sujeito a erros ou sensível a quebra de linha, etc.

Em vez disso, você pode codificar o texto em Base64 para ter uma string "limpa":

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Algumas notas sobre a codificação Base64:

  1. A codificação Base64 é uma codificação binária , então é melhor você ter certeza de obter seu conjunto de caracteres correto ao fazer a codificação, porque o MySQL irá decodificar a string codificada em Base64 em bytes e então interpretá-los. Tenha certezabase64 MySQL concorda com a codificação de caracteres (eu recomendo UTF-8).
  2. Eu envolvi a string em 50 colunas para facilitar a leitura no Stack Overflow. Você pode agrupá-lo em qualquer número de colunas que desejar (ou não agrupá-lo) e ainda funcionará.

Agora, para carregar isso no MySQL:

INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

Isso será inserido sem qualquer reclamação e você não precisará escapar manualmente nenhum texto dentro da string.


5

Você deve escapar dos caracteres especiais usando o \caractere.

This is Ashok's Pen.

Torna-se:

This is Ashok\'s Pen.

3

Se você quiser manter o apóstrofo (') no banco de dados, use o código abaixo

$new_value = str_replace("'","\'", $value); 

$ new_value pode armazenar no banco de dados.


3

Você pode usar este código,

<?php
     $var = "This is Ashok's Pen.";
     addslashes($var);
?>

se mysqli_real_escape_string () não funcionar.


3

Em PHP, use mysqli_real_escape_string .

Exemplo do Manual do PHP:

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

$city = "'s Hertogenbosch";

/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("Error: %s\n", mysqli_sqlstate($link));
}

$city = mysqli_real_escape_string($link, $city);

/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("%d Row inserted.\n", mysqli_affected_rows($link));
}

mysqli_close($link);
?>



0

Para acesso programático, você pode usar marcadores de para escapar automaticamente de caracteres não seguros para você.

Em Perl DBI, por exemplo, você pode usar:

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 

0

Use addlahes () ou mysql_real_escape_string ().


Apenas uma nota This, mysql_real_escape_string() extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.,.
NewBee

Sim, preciso adicionar um i now mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony

Seria melhor atualizar sua resposta (por exemplo, os comentários podem desaparecer a qualquer momento).
Peter Mortensen de

0

Do jeito que eu faço, usando Delphi:

TheString para "escapar":

TheString=" bla bla bla 'em some more apo:S 'em and so on ";

Solução:

StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);

Resultado:

TheString=" bla bla bla \'em some more apo:S \'em and so on ";

Esta função irá substituir todos os Char (39) por "\ '" permitindo a você inserir ou atualizar campos de texto no MySQL sem nenhum problema.

Funções semelhantes são encontradas em todas as linguagens de programação!


0

Talvez você possa dar uma olhada em função QUOTEno manual do MySQL.

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.