Come sfuggire apici in MySQL
Domanda
Come posso inserire un valore in MySQL che consistono di virgolette singole o doppie. cioè
This is Ashok's Pen.
L'apostrofo creerà problemi. Ci potrebbero essere altri caratteri di escape.
Come si fa a inserire correttamente i dati?
Soluzione
Mettere semplicemente:
SELECT 'This is Ashok''s Pen.';
Quindi, all'interno della stringa, sostituire ogni apostrofo con due di loro.
o
SELECT 'This is Ashok\'s Pen.'
Escape it =)
Altri suggerimenti
Vedere la mia risposta a "Come sfuggire caratteri in MySQL "
Qualunque sia la biblioteca che si utilizza per comunicare con MySQL avrà una funzione di fuga integrato, per esempio in PHP è possibile utilizzare mysqli_real_escape_string o PDO :: citazione
' è il carattere di escape. Così la stringa dovrebbe essere:
Questa è Pen Ashok 'di
Se si utilizza un codice di front-end, è necessario fare una stringa sostituire prima di inviare i dati alla stored procedure.
Per esempio, in C # si può fare
value = value.Replace("'", "''");
e quindi passare il valore alla stored procedure.
Se si utilizza istruzioni preparate, il driver di gestire qualsiasi fuga. Per 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();
Utilizzare questo codice:
<?php
$var = "This is Ashok's Pen.";
mysql_real_escape_string($var);
?>
Questo risolverà il vostro problema, perché il database non è in grado di rilevare i caratteri speciali di una stringa.
C'è un altro modo per fare questo, che può o non può essere più sicuro, a seconda del punto di vista. Richiede MySQL 5.6 o successiva per l'utilizzo di una funzione stringa specifica: FROM_BASE64
.
Diciamo che dispone di questo messaggio che vuoi inserire:
"Ah," Nick Quasi Senza Testa agitò una mano elegante, "una questione di importanza.... Non è come se avessi veramente voluto aderire.... Ho pensato di applicare, ma a quanto pare Sono non soddisfano i requisiti '-"
Quella citazione ha un mucchio di virgolette doppie single o e sarebbe un vero e proprio dolore per inserire in MySQL. Se si inserisce che da un programma, è facile sfuggire alle citazioni, ecc Ma, se si deve mettere che in uno script SQL, dovrete modificare il testo (per sfuggire le virgolette) che potrebbe essere soggetto a errori o sensibili al word-wrapping, ecc.
Invece, è possibile Base64-codificare il testo, in modo da avere una stringa "pulita":
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
Alcune note sulla Base64-encoding:
- Base64 codifica è un codifica binaria , quindi è meglio fare in modo che si ottiene il vostro personaggio impostato correttamente quando si esegue la codifica, perché MySQL sta per decodificare la stringa con codifica Base64 in byte e poi interpretare tali. Assicurarsi
base64
e MySQL sono d'accordo su ciò che la codifica dei caratteri è (mi raccomando UTF-8). - Ho avvolto la stringa da 50 colonne per una migliore leggibilità su Stack Overflow. Si può avvolgere a qualsiasi numero di colonne che si desidera (o non avvolgere affatto) e sarà ancora lavorare.
Ora, per caricare questo in MySQL:
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));
Questo inserirà senza alcuna lamentela, e non c'era bisogno di manualmente sfuggire a qualsiasi testo all'interno della stringa.
Si dovrebbe sfuggire i caratteri speciali utilizzando il carattere \
.
This is Ashok's Pen.
diventa:
This is Ashok\'s Pen.
Se si desidera conservare ( ') apostrofo nel database di utilizzare questo codice sotto
$new_value = str_replace("'","\'", $value);
$ nuovo_valore può memorizzare nel database.
È possibile utilizzare questo codice,
<?php
$var = "This is Ashok's Pen.";
addslashes($var);
?>
se mysqli_real_escape_string () non funziona.
In PHP, utilizzare mysqli_real_escape_string ..
Esempio da manuale di 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 si sta utilizzando PHP, basta usare i addslashes () la funzione.
Per l'accesso programmatico, è possibile utilizzare segnaposto per sfuggire automaticamente caratteri non sicuri per voi.
In Perl DBI, per esempio, è possibile utilizzare:
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
Usa sia addslahes () o mysql_real_escape_string ().
Il mio modo di fare, utilizzando Delphi:
TheString alla "fuga":
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 Char (39) con "\ '" che consente di inserire o aggiornare i campi di testo in MySQL senza alcun problema.
funzioni simili si trovano in tutti i linguaggi di programmazione!
Forse si potrebbe dare un'occhiata a funzione di QUOTE
nel manuale di MySQL.