Jak uniknąć pojedynczych cudzysłowów w MySQL


Odpowiedzi:


126

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 =)


9
Możesz chcieć zaktualizować swój post, aby zawierał mysql_real_escape_string () lub addlashes () jako możliwe rozwiązania ... tak jak w jednym z poniższych komentarzy, OP stwierdza, że ​​po prostu czytają z pliku i wstawiają.
James B

3
Metody mysql_ * nie są zalecane do użytku w przyszłości, ponieważ są przestarzałe .
hd1

To jest właściwa odpowiedź, chociaż obecnie najlepszą opcją jest użycie jednego z
Ryan,

10

'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.


Nie wstawiam danych ręcznie, wyodrębniam je z pliku i pojawią się vaklues: pióro Ashoka. Jak to włożyć. stworzyliśmy procedurę, jak to zrobić ... jak to naprawić.
Ashok Gupta

Dodatkowa nitka FWIW: ukośnik odwrotny to „znak ucieczki”; ''(dwa pojedyncze cudzysłowy) to specjalna alternatywa dozwolona dla „zmiany znaczenia” znaku pojedynczego cudzysłowu.
ToolmakerSteve

9

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


1
Nie wstawiam danych ręcznie, wyodrębniam je z pliku i będą tam wartości: pióro Ashoka. Jak to włożyć. stworzyłem procedurę, jak to zrobić… jak to naprawić.
Ashok Gupta

Tylko uwaga, 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

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();

7

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.


1
Tylko uwaga, 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

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:

  1. Kodowanie Base64 jest kodowaniem binarnym , więc lepiej upewnij się, że zestaw znaków jest poprawny podczas kodowania, ponieważ MySQL zdekoduje ciąg zakodowany w Base64 na bajty, a następnie zinterpretuje je. Upewnij się, że base64MySQL zgadzają się co do kodowania znaków (polecam UTF-8).
  2. Zawijałem ciąg do 50 kolumn, aby zapewnić czytelność na przepełnieniu stosu. Możesz zawinąć go do dowolnej liczby kolumn (lub w ogóle nie zawijać) i nadal będzie działać.

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.


5

Powinieneś uciec przed znakami specjalnymi za pomocą \znaku.

This is Ashok's Pen.

Staje się:

This is Ashok\'s Pen.

3

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.


3

Możesz użyć tego kodu,

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

jeśli mysqli_real_escape_string () nie działa.


3

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);
?>



0

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)); 

0

Użyj addlahes () lub mysql_real_escape_string ().


Tylko uwaga, 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

Tak, trzeba dodać i now mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony

Lepiej byłoby zaktualizować swoją odpowiedź (np. Komentarze mogą zniknąć w dowolnym momencie).
Peter Mortensen

0

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!


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.