Jak wstawić do MySQL wartość składającą się z pojedynczych lub podwójnych cudzysłowów. to znaczy
This is Ashok's Pen.
Pojedynczy cytat spowoduje problemy. Mogą istnieć inne znaki ucieczki.
Jak poprawnie wstawiasz dane?
Jak wstawić do MySQL wartość składającą się z pojedynczych lub podwójnych cudzysłowów. to znaczy
This is Ashok's Pen.
Pojedynczy cytat spowoduje problemy. Mogą istnieć inne znaki ucieczki.
Jak poprawnie wstawiasz dane?
Odpowiedzi:
Mówiąc prościej:
SELECT 'This is Ashok''s Pen.';
Więc wewnątrz ciągu zamień każdy pojedynczy cytat na dwa z nich.
Lub:
SELECT 'This is Ashok\'s Pen.'
Escape it =)
'to znak ucieczki. Więc twój ciąg powinien być:
To jest Pióro Ashoka
Jeśli używasz jakiegoś kodu frontonu, przed wysłaniem danych do procedury składowanej musisz wykonać zamianę ciągu.
Na przykład w C # możesz to zrobić
value = value.Replace("'", "''");
a następnie przekazać wartość do procedury składowanej.
''
(dwa pojedyncze cudzysłowy) to specjalna alternatywa dozwolona dla „zmiany znaczenia” znaku pojedynczego cudzysłowu.
Zobacz moją odpowiedź na temat „Jak zmienić znaczenie znaków w MySQL”
Każda biblioteka, której używasz do rozmowy z MySQL, będzie miała wbudowaną funkcję ucieczki, np. W PHP możesz użyć mysqli_real_escape_string lub 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.
.
Jeśli korzystasz z przygotowanych instrukcji, sterownik obsłuży każdą ucieczkę. Na przykład (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();
Użyj tego kodu:
<?php
$var = "This is Ashok's Pen.";
mysql_real_escape_string($var);
?>
To rozwiąże problem, ponieważ baza danych nie może wykryć znaków specjalnych ciągu.
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.
.
Jest na to inny sposób, który może być bezpieczniejszy lub nie, w zależności od twojej perspektywy. To wymaga MySQL 5.6 lub później z powodu korzystania z określonej funkcji strun: FROM_BASE64
.
Powiedzmy, że masz tę wiadomość, którą chcesz wstawić:
„Ach,” Prawie Bezgłowy Nick machnął elegancką ręką, „sprawa bez znaczenia… To nie jest tak, że naprawdę chciałem się przyłączyć… Myślałem, że aplikuję, ale najwyraźniej nie spełniam wymagań "-"
Ten cytat zawiera kilka pojedynczych i podwójnych cudzysłowów i byłoby naprawdę trudne do wstawienia do MySQL. Jeśli wstawiasz to z programu, łatwo jest uniknąć cudzysłowów itp. Ale jeśli musisz umieścić to w skrypcie SQL, będziesz musiał edytować tekst (aby uniknąć cudzysłowów), który może być podatny na błędy lub wrażliwe na zawijanie słów itp.
Zamiast tego możesz zakodować tekst Base64, aby uzyskać „czysty” ciąg:
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
Kilka uwag na temat kodowania Base64:
base64
MySQL zgadzają się co do kodowania znaków (polecam UTF-8).Teraz, aby załadować to do MySQL:
INSERT INTO my_table (text) VALUES (FROM_BASE64('
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));
Spowoduje to wstawienie bez żadnych skarg i nie musisz ręcznie zmieniać znaczenia żadnego tekstu w ciągu.
Jeśli chcesz zachować apostrof (') w bazie danych, użyj poniższego kodu
$new_value = str_replace("'","\'", $value);
$ new_value może przechowywać w bazie danych.
W PHP użyj mysqli_real_escape_string .
Przykład z podręcznika 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']);
Jeśli używasz PHP, po prostu użyj funkcji addlashes ().
Aby uzyskać dostęp programowy, możesz użyć symboli zastępczych, aby automatycznie uciec przed niebezpiecznymi znakami.
Na przykład w Perl DBI możesz użyć:
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
Użyj addlahes () lub 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.
.
Tak jak ja, używając Delphi:
TheString to „escape”:
TheString=" bla bla bla 'em some more apo:S 'em and so on ";
Rozwiązanie:
StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);
Wynik:
TheString=" bla bla bla \'em some more apo:S \'em and so on ";
Ta funkcja zamieni wszystkie znaki Char (39) na "\ '", umożliwiając wstawianie lub aktualizowanie pól tekstowych w MySQL bez żadnego problemu.
Podobne funkcje można znaleźć we wszystkich językach programowania!