在python

时间:2016-04-09 05:11:12

标签: python mysql unicode

我正在使用mysql.connector python库和python 2.7

我有一个unicode字符串,可能包含也可能不包含单引号和双引号。 以下是我为逃生功能尝试的事情:

def escape(string):
#string.MySQL.escape_string()
#string = string.decode('string_escape')
#string = string.encode('unicode-escape').replace("'", "''")
#string = string.encode('unicode-escape').replace('"', '\"')
#string = string.encode('unicode-escape').replace("'", u"\u2019")
#string = string.encode('unicode-escape').replace('''"''', u"\u201D")
#string = string.encode('unicode-escape').replace('''''', u"\u201D")
return string

似乎没有任何效果。我尝试使用this函数,但仍然给出了mysql语法错误。

我需要mysql.connector库中的一些东西,它可以在不破坏unicode和mysql查询的情况下转义单引号和双引号。

以下是我正在使用的SQL查询示例:

"""SELECT * FROM messages WHERE msg_id = '{msg_id}'""".format(**db_dict)

如果需要更多细节,请告诉我

编辑:示例SQL查询已更新

1 个答案:

答案 0 :(得分:2)

MySQLdb正式声明使用format paramstyle,但它也支持pyformat样式*,因此如果你想使用dict中的参数,你可以使用:

db_dict = {'msg_id': "1'2'3", ...}
cursor.execute("SELECT * FROM messages WHERE msg_id = %(msg_id)s", db_dict)

使用字符串操作来创建sql查询只会导致sql注入漏洞,所以你永远不应该这样做。

* ...大多数在屏幕后面使用python字符串格式的数据库连接器都是这样做的,它们指定格式或pyformat格式为paramstyle但实际上支持两者。 dbapi2不允许在这里指定两个值,但它也不禁止支持多个parmstyles。如果您编写可能使用unknowon dbapi2连接器的代码,那么您就可以查询支持的paramstyle,能够知道所有内容都很好但是没有必要。