Ja, das ist ein echtes Durcheinander. Sowohl MySQL als auch PostgreSQL verwenden standardmäßig Backslash-Escapes. Das ist ein schrecklicher Schmerz, wenn Sie die Zeichenkette auch wieder mit umgekehrten Schrägstrichen verlassen, anstatt die Parametrisierung zu verwenden, und sie ist auch falsch gemäß ANSI SQL: 1992, die besagt, dass standardmäßig keine zusätzlichen Escape-Zeichen oberhalb der normalen Zeichenkette vorhanden sind daher keine Möglichkeit, ein Literal %
oder _
einzuschließen.
Ich würde davon ausgehen, die einfache Schrägstrich-ersetzen Methode geht auch falsch, wenn Sie die Backslash-Fluchten deaktivieren (die sich nicht konform mit ANSI SQL) sind, mit NO_BACKSLASH_ESCAPE
sql_mode in MySQL oder standard_conforming_strings
conf in PostgreSQL (welche die PostgreSQL Entwickler droht jetzt für ein paar Versionen zu tun).
Die einzige wirkliche Lösung ist die Verwendung der wenig bekannten LIKE...ESCAPE
-Syntax, um ein explizites Escape-Zeichen für das LIKE
-Muster anzugeben. Dies wird anstelle des Backslash-Escape in MySQL und PostgreSQL verwendet, sodass sie dem entsprechen, was alle anderen Benutzer tun, und eine garantierte Möglichkeit bietet, die Out-of-Band-Zeichen einzuschließen. Zum Beispiel mit dem =
Zeichen als Escape:
# look for term anywhere within title
term= term.replace('=', '==').replace('%', '=%').replace('_', '=_')
sql= "SELECT * FROM things WHERE description LIKE %(like)s ESCAPE '='"
cursor.execute(sql, dict(like= '%'+term+'%'))
Dies funktioniert auf PostgreSQL, MySQL und ANSI SQL-kompatiblen Datenbanken (Modulo der paramstyle natürlich, die auf verschiedenen db Module ändert).
Es kann immer noch ein Problem mit MS SQL Server/Sybase geben, das anscheinend auch [a-z]
-Style-Zeichengruppen in LIKE
Ausdrücken erlaubt. In diesem Fall möchten Sie auch das Literalzeichen mit .replace('[', '=[')
zurückgeben. Nach ANSI SQL-Escaping ist jedoch ein Zeichen, das nicht zu entkommen ist, ungültig! (Argh!) Obwohl es wahrscheinlich immer noch über echte DBMS funktionieren wird, sind Sie immer noch nicht ANSI-konform. Seufzer ...
Sie haben vergessen '' 'und' '' –
@JensTimmerman diese Funktion nur entkommen die gleichen Token, die normale Zeichenfolge zu verwenden, die auf das Ergebnis vor der Verwendung in einer Abfrage. Korrekte String-Escaping hängt von der Sessing 'standard_conforming_stings' und Das geht am besten mit dem Bibliothekscode – Jasen