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.