Come inserisco un valore in MySQL composto da virgolette singole o doppie. cioè
This is Ashok's Pen.
L'unica citazione creerà problemi. Potrebbero esserci altri caratteri di escape.
Come si inseriscono correttamente i dati?
Come inserisco un valore in MySQL composto da virgolette singole o doppie. cioè
This is Ashok's Pen.
L'unica citazione creerà problemi. Potrebbero esserci altri caratteri di escape.
Come si inseriscono correttamente i dati?
Risposte:
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 =)
'è 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.
''
(due virgolette singole) è un'alternativa speciale consentita per "eseguire l'escape" di un carattere virgolette singole.
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
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.
.
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();
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.
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.
.
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:
base64
che MySQL sia d'accordo su quale sia la codifica dei caratteri (consiglio UTF-8).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.
Se vuoi mantenere l'apostrofo (') nel database usa questo codice sotto
$new_value = str_replace("'","\'", $value);
$ new_value può essere archiviato nel database.
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);
?>
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
Se stai usando PHP, usa semplicemente la funzione addlashes ().
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));
Utilizza oAddlahes () o mysql_real_escape_string ().
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.
.
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!