Wie entkomme ich Apostroph (') in MySql?

146

Die MySQL-Dokumentation sagt, dass es sein sollte \'. Sowohl scite als auch mysql zeigen jedoch, dass dies ''funktioniert. Ich habe das gesehen und es funktioniert. Was soll ich machen?

user4951
quelle
Sprechen Sie darüber, ob ''oder \'ist richtig?
Raptor
\'ist MySQL-spezifisch, während ''ANSI SQL-konform ist, wenn ich mich nicht irre
apokryfos
Abhängig von der Implementierung von SQL ermöglichen - '' \ '', '\' 'und manchmal' [']' 'einen Ausbruch aus dem Code. Darüber hinaus wird diese Prüfung durch eine beliebige Anzahl von Unicode-Ersetzungen umgangen. Das ganze Spiel hier missbraucht die Qualität der "Flucht", die erfordert, dass die endgültige Zählung eher gerade als ungerade ist. Wenn es ungerade wird, indem mehrere Escape-Methoden ineinander gemischt werden, können Sie das Escape-Verfahren umgehen und unformatiertes SQL einfügen. Moral der Geschichte: Verwenden Sie NIEMALS String-Interpolation, verwenden Sie IMMER vorbereitete Anweisungen.
Shayne

Antworten:

185

Die von Ihnen zitierte MySQL-Dokumentation sagt tatsächlich etwas mehr aus, als Sie erwähnen. Es heißt auch:

Ein " '" in einer mit " '" zitierten Zeichenfolge kann als " ''" geschrieben werden.

(Außerdem haben Sie eine Verknüpfung zur MySQL 5.0-Version von Tabelle 8.1 hergestellt. Sonderzeichen-Escape-Sequenzen und die aktuelle Version ist 5.6 - die aktuelle Tabelle 8.1. Sonderzeichen-Escape-Sequenzen sehen jedoch ziemlich ähnlich aus.)

Ich denke, der Postgres-Hinweis zum backslash_quote (string)Parameter ist informativ:

Hiermit wird gesteuert, ob ein Anführungszeichen \'in einem Zeichenfolgenliteral dargestellt werden kann. Die bevorzugte Methode zur Darstellung eines Anführungszeichens nach SQL-Standard ist das Verdoppeln ( ''), aber PostgreSQL hat dies historisch auch akzeptiert \'. Die Verwendung von \'schafft jedoch Sicherheitsrisiken ...

Das sagt mir, dass die Verwendung eines doppelten einfachen Anführungszeichens insgesamt eine bessere und langfristige Wahl ist als die Verwendung eines Backslashs, um dem einfachen Anführungszeichen zu entkommen.

Wenn Sie nun auch die Auswahl der Sprache, die Auswahl der SQL-Datenbank und ihrer nicht standardmäßigen Macken sowie die Auswahl des Abfrage-Frameworks zur Gleichung hinzufügen möchten, haben Sie möglicherweise eine andere Auswahl. Sie geben nicht viele Informationen über Ihre Einschränkungen.

Jim DeLaHunt
quelle
42

Standard-SQL verwendet doppelte Anführungszeichen. MySQL muss das akzeptieren, um einigermaßen konform zu sein.

'He said, "Don''t!"'
Jonathan Leffler
quelle
+1. Wo steht, dass es von '' not dev.mysql.com/doc/refman/5.0/en/…
user4951
Es heißt "darf" statt "sollte", aber die Informationen sind da (unter der Tabelle): Es gibt verschiedene Möglichkeiten, Anführungszeichen in eine Zeichenfolge aufzunehmen: Ein " '" in einer mit " '" zitierten Zeichenfolge kann als " ''" geschrieben werden. . Ein " "" in einer mit " "" zitierten Zeichenfolge kann als " """ geschrieben werden. Vor dem Anführungszeichen steht ein Escape-Zeichen ("` `").
Jonathan Leffler
1
Dies ist der beste Weg, um dem Apostroph zu entkommen, indem Sie ihn verdoppeln.
Alex _TNT
10

Was ich glaube, bedeutete user2087510:

name = 'something'
name = name.replace("'", "\\'")

Ich habe dies auch mit Erfolg genutzt.

user3169788
quelle
1
Arbeitete für mich, während diese Top-Antworten nicht
Jared
1
warum \\ 'statt \'?
Biniam
@biniam_Ethiopia der zweite \ entkommt dem ersten
Juha Untinen
2
mögliches Sicherheitsproblem. kann SQL-Injection erhalten, wenn die Zeichenfolge bereits \ 'enthält, also fügen Sie ein \ ein, das sich jetzt in der Zeichenfolge als \\' befindet, wodurch die Zeichenfolge beendet wird. Verwenden Sie stattdessen name.replace ("'", "' '")
Garr Godfrey
6

schreibe einfach ''anstelle von 'ich meine zweimal'

MRRaja
quelle
1
Verwenden Sie Apostroph zweimal anstelle von einem
MRRaja
5

Hier ist ein Beispiel:

SELECT * FROM pubs WHERE name LIKE "%John's%"

Verwenden Sie einfach doppelte Anführungszeichen, um das einfache Anführungszeichen einzuschließen.

Wenn Sie darauf bestehen, einfache Anführungszeichen zu verwenden (und die Notwendigkeit, dem Zeichen zu entkommen):

SELECT * FROM pubs WHERE name LIKE '%John\'s%'
Overkillica
quelle
4

Ich kenne drei Möglichkeiten. Das erste ist nicht das schönste und das zweite ist in den meisten Programmiersprachen üblich:

  1. Verwenden Sie ein anderes einfaches Anführungszeichen: 'I mustn''t sin!'
  2. Verwenden Sie das Escape-Zeichen \vor dem einfachen Anführungszeichen ':'I mustn\'t sin!'
  3. Verwenden Sie doppelte Anführungszeichen, um Zeichenfolgen anstelle von einfachen Anführungszeichen einzuschließen: "I mustn't sin!"
Robert Rocha
quelle
Meine persönliche Präferenz wäre, \'da es von so vielen Programmiersprachen verwendet wird, aber ''von mehr SQL-Dialekten unterstützt wird. Daher ist die Verwendung von Option 1 aus Kompatibilitätsgründen besser. Sqlite funktioniert beispielsweise nicht mit Backslash-Escapezeichen.
Okdewit
0

Ersetzen Sie die Zeichenfolge

value = value.replace(/'/g, "\\'");

Dabei ist value Ihre Zeichenfolge, die in Ihrer Datenbank gespeichert wird.

Des Weiteren,

NPM-Paket dafür können Sie sich ansehen

https://www.npmjs.com/package/mysql-apostrophe

Ashutosh Jha
quelle
Bitte posten Sie nicht nur ein Tool oder eine Bibliothek als Antwort. Zeigen Sie zumindest in der Antwort selbst , wie das Problem gelöst wird .
Baum mit Augen
Das wird nicht funktionieren. Du hast vergessen, den Dingen zu entkommen. ersetzen (/ \ '/ g, "\\\'")
Michael
0

Ich denke, wenn Sie einen Datenpunkt mit Apostroph haben, können Sie einen Apostroph vor dem Apostroph hinzufügen

z.B. "Dies ist Johns Platz"

Hier nimmt MYSQL zwei Sätze an: "Dies ist Johns Platz."

Sie können "Dies ist Johns Platz" setzen. Ich denke, das sollte so funktionieren.

Priyanka Pandhi
quelle
0

Möglicherweise nicht zum Thema gehörend, aber vielleicht sind Sie hierher gekommen, um nach einer Möglichkeit zu suchen, die Texteingabe aus einem HTML-Formular zu bereinigen. Wenn ein Benutzer das Apostrophzeichen eingibt, wird beim Versuch, den Text in eine SQL zu schreiben, kein Fehler ausgegeben -basierte Tabelle in einer DB. Es gibt verschiedene Möglichkeiten, dies zu tun, und Sie möchten vielleicht auch etwas über SQL-Injection lesen. Eine einfache Option in PHP ist jedoch die Verwendung der Funktion htmlspecialchars () , mit der alle Ihre Apostrophe konvertiert werden, in 'die Sie möglicherweise speichern möchten wie auch immer.

Grindlay
quelle
Die Codierung dient nicht zum Speichern, sondern zum Anzeigen. Verwenden Sie vorbereitete Anweisungen.
Mickmackusa
Ich stimme zu, dass vorbereitete Aussagen der Goldstandard für Sicherheit und Zuverlässigkeit sind. Ich habe einen bestimmten Fall hervorgehoben, in dem Sie möglicherweise Textdaten als HTML speichern möchten. In diesem Fall verwendet meine Methode nicht gebundene Parameter, sondern anstelle von. HTML rein, HTML raus.
Grindlay