用于MySQL的转义字符串Python


70

我使用Python和MySQLdb下载网页并将其存储到数据库中。我的问题是我无法将复杂的字符串保存在数据库中,因为它们没有正确地转义。

Python中是否有一个我可以用来为MySQL转义字符串的函数?我尝试使用'''(三重简单引号)和""",但没有用。我知道PHP具有mysql_escape_string(),在Python中是否类似?

谢谢。


db_cur.execute('''UPDATE test_table SET field_1="%s" WHERE field_2="%s"''' % (data, condition))注意三联单引号和双引号%s
zelusp

旧线程,但是%代码中的最后一个标记不应该是,逗号吗,否则就一样吗?@zelusp
Artemis

不,我认为这是对的-除非您运行了我的代码,否则我错了。% (data, condition)走的是变量datacondition并把它到两个%s占位符。
zelusp

那只是python字符串格式,它将被替换。condition例如,如果使用,则" or 1 == 1 or" 可能会出现问题。cur.execute通过做提供转义cur.execute('SOME COMMAND ?', [value])?被价值所取代。
Artemis

Answers:


95
conn.escape_string()

请参见MySQL C API函数映射:http : //mysql-python.sourceforge.net/MySQLdb.html


2
+1 ...完美答案。惊讶地看到这么多复杂的答案。显然,参数查询不考虑存储的长字符串(文本)。
Mike

2
+1我喜欢黑白相间的HTML页面,其中包含脏话和代码。
Droogans 2011年

4
_mysql.escape_string(“ input's”)也可以使mysql的ascii字符串转义。显然不是Unicode。_mysql.escape_string(u“ input'séh”)
Knowledge_is_power

1
此功能的参数是什么?
用户

我们的等效项将是MySQLdb.escape_string(“”)
possumkeys'Aug

69

如果您使用MySQLdb库的实现来构建SQL查询字符串而不是尝试构建自己的SQL字符串,则MySQLdb库实际上将为您执行此操作。

不要做:

sql = "INSERT INTO TABLE_A (COL_A,COL_B) VALUES (%s, %s)" % (val1, val2)
cursor.execute(sql)

做:

sql = "INSERT INTO TABLE_A (COL_A,COL_B) VALUES (%s, %s)"
cursor.execute(sql, (val1, val2))

3
有点令人反感的是它强制使用引号。例如,如果要插入条件表(TABLE_A而不是“ TABLE_A”),则无法使用此方法完全完成此操作。
bozdoz

4
bozdoz,这在很大程度上是设计使然,因为它可以防止SQL注入。如果要插入条件表,请首先确保无法将用户提交的字符串用于表名,然后将其直接添加到查询中。
techdude

1
这绝对是正确的答案。永远不知道有什么新方法可以解决字符串转义(就像我们目前在PHP世界中所做的那样)。总是更安全地执行准备好的语句
Brian Leishman

使用Builder格式完全相同的调用db.literal作为escape呢,所以称其为“更安全”是一个有点用词不当。使用它是因为它对于小型查询更容易,但是当您不得不手工制作大型查询或脚本时,不必担心会丢失某些内容。
cz

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

嗯 似乎StackOverflows突出显示算法不知道Python的三引号。
马丁·托马

这对于在逐个构造SQL字符串的例程中使用特别有用。
安德鲁·巴西勒

适用于Python3的MySQLdb fork:github.com/PyMySQL/mysqlclient-python
Ian Mackinnon

3

使用sqlalchemy的text函数删除特殊字符的解释:

请注意text("your_insert_statement")以下功能的使用。它所做的是与sqlalchemy交流,传入字符串中的所有问号和百分号都应视为文字。

import sqlalchemy
from sqlalchemy import text
from sqlalchemy.orm import sessionmaker
from datetime import datetime
import re

engine = sqlalchemy.create_engine("mysql+mysqlconnector://%s:%s@%s/%s"
     % ("your_username", "your_password", "your_hostname_mysql_server:3306",
     "your_database"),
     pool_size=3, pool_recycle=3600)

conn = engine.connect()

myfile = open('access2.log', 'r')
lines = myfile.readlines()

penguins = []
for line in lines:
   elements = re.split('\s+', line)

   print "item: " +  elements[0]
   linedate = datetime.fromtimestamp(float(elements[0]))
   mydate = linedate.strftime("%Y-%m-%d %H:%M:%S.%f")

   penguins.append(text(
     "insert into your_table (foobar) values('%%%????')"))

for penguin in penguins:
    print penguin
    conn.execute(penguin)

conn.close()


0

解决此问题的另一种方法是在python中使用mysqlclient时使用类似的方法。

假设您要输入的数据是这样的<ol><li><strong style="background-color: rgb(255, 255, 0);">Saurav\'s List</strong></li></ol>。它包含双qoute和单引号。

您可以使用以下方法对引号进行转义:

statement =“”“更新聊天集html ='{}'”“” .format(html_string.replace(“'”,“ \\\'”))

注意:需要三个\字符以转义无格式python字符串中的单引号。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.