Come sfuggire alle virgolette singole in MySQL


Risposte:


126

In parole semplici:

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

Quindi all'interno della stringa, sostituisci ogni singola virgoletta con due di esse.

O:

SELECT 'This is Ashok\'s Pen.'

Scappa =)


9
Potresti voler aggiornare il tuo post per includere mysql_real_escape_string () o addlashes () come possibili soluzioni ... come in uno dei commenti qui sotto, l'OP afferma che stanno solo leggendo dal file e inserendo.
James B,

3
I metodi mysql_ * non sono consigliati per un uso futuro, poiché sono deprecati .
hd1

Questa è la risposta giusta, anche se in questi giorni l'opzione migliore è usare uno dei
Ryan

10

'è il carattere di fuga. Quindi la tua stringa dovrebbe essere:

Questa è la penna di Ashok

Se si utilizza un codice front-end, è necessario eseguire una sostituzione della stringa prima di inviare i dati alla stored procedure.

Ad esempio, in C # puoi fare

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

e quindi passare il valore alla stored procedure.


Non sto inserendo i dati manualmente, li estraggo da File e ci sarà vaklues: la penna di Ashok. Come inserirlo. ha creato una procedura per farlo .. come correggerlo.
Ashok Gupta

FWIW minor nit: backslash è "il carattere di escape"; ''(due virgolette singole) è un'alternativa speciale consentita per "eseguire l'escape" di un carattere virgolette singole.
ToolmakerSteve

9

Vedi la mia risposta a "Come sfuggire ai caratteri in MySQL"

Qualunque libreria tu stia usando per parlare con MySQL avrà una funzione di escape incorporata, ad esempio in PHP potresti usare mysqli_real_escape_string o PDO :: quote


1
Non sto inserendo i dati manualmente, li estraggo da File e ci saranno dei valori: la penna di Ashok. Come inserirlo. ha creato una procedura per fare questo .. come correggerlo.
Ashok Gupta

Solo una 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 utilizzi istruzioni preparate, il driver gestirà qualsiasi tipo di escape. Ad esempio (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

Usa questo codice:

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

    mysql_real_escape_string($var);
?>

Questo risolverà il tuo problema, perché il database non può rilevare i caratteri speciali di una stringa.


1
Solo una 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

C'è un altro modo per farlo che può essere più sicuro o meno, a seconda della tua prospettiva. Richiede MySQL 5.6 o successiva per l'utilizzo di una funzione stringa specifica: FROM_BASE64.

Supponiamo che tu abbia questo messaggio che desideri inserire:

"Ah," Nick quasi senza testa agitò una mano elegante, "una questione senza importanza ... Non è come se volessi davvero unirmi ... Pensavo di candidarmi, ma a quanto pare non soddisfano i requisiti '- "

Quella citazione ha un mucchio di virgolette singole e doppie e sarebbe un vero problema da inserire in MySQL. Se lo stai inserendo da un programma, è facile sfuggire alle virgolette, ecc. Ma, se devi inserirlo in uno script SQL, dovrai modificare il testo (per evitare le virgolette) che potrebbe essere soggetto a errori o sensibile al wrapping delle parole, ecc.

Invece, puoi codificare in Base64 il testo, in modo da avere una stringa "pulita":

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Alcune note sulla codifica Base64:

  1. La codifica Base64 è una codifica binaria , quindi è meglio assicurarsi di ottenere il set di caratteri corretto quando si esegue la codifica, perché MySQL decodificherà la stringa codificata Base64 in byte e quindi li interpreterà. Assicurati base64che MySQL sia d'accordo su quale sia la codifica dei caratteri (consiglio UTF-8).
  2. Ho avvolto la stringa in 50 colonne per la leggibilità su Stack Overflow. Puoi avvolgerlo in qualsiasi numero di colonne desideri (o non avvolgerlo affatto) e continuerà a funzionare.

Ora, per caricarlo in MySQL:

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

Questo verrà inserito senza lamentele e non è stato necessario eseguire manualmente l'escape di alcun testo all'interno della stringa.


5

Devi eseguire l'escape dei caratteri speciali usando il \carattere.

This is Ashok's Pen.

Diventa:

This is Ashok\'s Pen.

3

Se vuoi mantenere l'apostrofo (') nel database usa questo codice sotto

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

$ new_value può essere archiviato nel database.


3

Puoi usare questo codice,

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

se mysqli_real_escape_string () non funziona.


3

In PHP, usa mysqli_real_escape_string .

Esempio dal manuale 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

Per l'accesso programmatico, puoi utilizzare i segnaposto per eseguire automaticamente l'escape dei caratteri non sicuri.

In Perl DBI, ad esempio, puoi usare:

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

0

Utilizza oAddlahes () o mysql_real_escape_string ().


Solo una 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

Yup, necessità di aggiungere un ora mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony

Sarebbe meglio aggiornare la tua risposta (es. I commenti potrebbero scomparire in qualsiasi momento).
Peter Mortensen

0

Il modo in cui lo faccio io, usando Delphi:

TheString to "escape":

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

Soluzione:

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

Risultato:

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

Questa funzione sostituirà tutti i Char (39) con "\" permettendoti di inserire o aggiornare i campi di testo in MySQL senza alcun problema.

Funzioni simili si trovano in tutti i linguaggi di programmazione!


0

Forse potresti dare un'occhiata alla funzione QUOTEnel manuale MySQL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.