Python MySQL entkommt Sonderzeichen

Ich benutze Python, um einen String in MySQL mit Sonderzeichen einzufügen.

Der String zum Einfügen sieht so aus:

macaddress_eth0;00:1E:68:C6:09:A0;macaddress_eth1;00:1E:68:C6:09:A1 

Hier ist das SQL:

 UPGRADE inventory_server set server_mac = macaddress\_eth0\;00\:1E\:68\:C6\:09\:A0\;macaddress\_eth1\;00\:1E\:68\:C6\:09\:A1' where server_name = 'myhost.fqdn.com 

Wenn ich das Update ausführe, bekomme ich diesen Fehler:

 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPGRADE inventory_server set server_mac = 'macaddress\_eth0\;00\:1E\:68\:C6\:09\' at line 1 

Der Python-Code:

 sql = 'UPGRADE inventory_server set server_mac = \'%s\' where server_name = \'%s\'' % (str(mydb.escape_string(macs)),host) print sql try: con = mydb.connect(DBHOST,DBUSER,DBPASS,DB); with con: cur = con.cursor(mydb.cursors.DictCursor) cur.execute(sql) con.commit() except: return False 

Wie kann ich diesen Text roh einfügen?

  • ImportError: Kein Modul namens MySQLdb
  • Python: Wie man einen Generator verwendet, um sql Speicher Problem zu vermeiden
  • Wie benutzt man MySQL mit Anacondas Python IDE
  • Möchten Sie ein Bild anzeigen
  • Python & MySql: Unicode und Codierung
  • Was ist eine gute Praxis / Design, um mulitple SQL-Abfragen in Python zu fädeln
  • In Django, wie man Tabellen aus einer SQL-Datei erstellen, wenn syncdb ausgeführt wird
  • MemoryError mit json.dumps ()
  • 3 Solutions collect form web for “Python MySQL entkommt Sonderzeichen”

    Dies ist einer der Gründe, warum Sie die Parameterbindung anstelle der Formatierung der Parameter in Python verwenden sollen.

    Tu das einfach

     sql = 'UPGRADE inventory_server set server_mac = %s where server_name = %s' 

    Dann:

     cur.execute(sql, macs, host) 

    Auf diese Weise können Sie nur mit der Zeichenfolge als String umgehen, und lassen Sie die MySQL-Bibliothek herausfinden, wie Sie zitieren und es für Sie entkommen.

    Darüber hinaus bekommst du in der Regel eine bessere Leistung (weil MySQL kann kompilieren und Cache eine Abfrage und Wiederverwendung es für verschiedene Parameterwerte) und vermeiden SQL-Injection-Angriffe (eine der häufigsten Möglichkeiten, um sich selbst gehackt).

    Python Beispiel, wie man rohen Text einfügen:

    Erstellen Sie eine Tabelle in MySQL:

     create table penguins(id int primary key auto_increment, msg VARCHAR(4000)) 

    Python-Code:

     #!/usr/bin/env python import sqlalchemy from sqlalchemy import text engine = sqlalchemy.create_engine( "mysql+mysqlconnector://yourusername:yourpassword@yourhostname.com/your_database") db = engine.connect() weird_string = "~!@#$%^&*()_+`1234567890-={}|[]\;':\"" sql = text('INSERT INTO penguins (msg) VALUES (:msg)') insert = db.execute(sql, msg=weird_string) db.close() 

    Führen Sie es aus, prüfen Sie die Ausgabe:

     select * from penguins 1 ~!@#$%^&*()_+`1234567890-={}|[]\;\':" 

    Keiner dieser Charaktere wurde beim Einfügen interpretiert.

    Obwohl ich auch glaube, dass die Parameterbindung verwendet werden sollte, gibt es auch:

     >>> import MySQLdb >>> example = r"""I don't like "special" chars ¯\_(ツ)_/¯""" >>> example 'I don\'t like "special" chars \xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf' >>> MySQLdb.escape_string(example) 'I don\\\'t like \\"special\\" chars \xc2\xaf\\\\_(\xe3\x83\x84)_/\xc2\xaf' 
    Python ist die beste Programmiersprache der Welt.