Python:从MySQL查询中逃脱单引号

时间:2013-04-27 15:20:19

标签: python unicode utf-8 mysql-python

我有一个在循环中运行的查询字符串,并且列表查询中的每个项都被执行。该列表包含字符串,我使用python字符串格式技术将查询替换为列表中的相应字符串作为迭代进度。

我已将查询与列表中的字符串一起单独编码:这是我的无线编码查询:

query = ur'''SELECT something FROM some_table WHERE some_name LIKE "{this_name}%"'''

在执行之前,我将查询字符串编码为utf-8

            try:
                formatted_query = query.format(this_name=list_name)
                #encode the query
                encoded_q = formatted_query.encode('utf-8')
                # execute the query
                self.dbCursor.execute(encoded_q)
                row = self.dbCursor.fetchone()
            except Exception, e:
                traceback.print_exc()

但问题是,有时我会从列表中遇到具有单引号示例的字符串:foo's。我已经使用了utf-8,我想这样做我不必担心这样的情况。但我得到sql错误,因为MySQL没有跳过单引号。

我的下一次尝试是替换单引号:

format_string = u"foo's".replace(u"'",u"\'")

但这也不起作用。我也看到this question的答案是使用我不知道的mysqldb库内置功能,所以我从stackoverflow社区寻求帮助来解决这个问题。

我更改代码以反映答案中建议的解决方案,但结果是相同的:以下是更改:

args = [u"{this_name}%".format(this_name=format_name)]
self.dbCursor.execute(query.encode('utf-8'), args)

#error被抛出这一行:

错误:

UnicodeEncodeError: 'latin-1' codec can't encode character u'\u014d' in position 4: ordinal not in range(256)

这是错误抱怨的字符串,我已经检查了该字符串的类型,它是一个单独的字符串。

this_name= Sentōkisei type= <type 'unicode'>

3 个答案:

答案 0 :(得分:4)

如果使用两个参数调用dbCursor.execute,则数据库适配器将为您引用参数。有关详细信息,请参阅DB-API specification

query = u'''SELECT something FROM some_table WHERE some_name LIKE %s'''
args = [u"{this_name}%".format(this_name=list_name)]
self.dbCursor.execute(query, args)

%s中的queryparameter marker。它将被args中给出的引用参数替换。要使用的正确参数标记取决于您的数据库适配器。例如,MySQLdb使用%s,而oursqlsqlite3使用?

建议使用参数化SQL。你真的不应该自己引用这些论点。


关于错误,请发布

this_name= Sentōkisei type= <type 'unicode'>

我将假设这意味着format_name是unicode。因此,

args = [u"{this_name}%".format(this_name=format_name)]

args列为包含一个unicode的列表。

现在我们到达引发错误的行:

self.dbCursor.execute(query.encode('utf-8'), args)

query已经unicode。如果您对该unicode进行编码,则它变为str。因此query.encode('utf-8')str,但argsunicode的列表。我不确定你为什么要编码query,但你的数据库适配器应该能够获取两个unicode参数。所以试试

self.dbCursor.execute(query, args)

现在,在重新阅读您的评论时,您似乎已经尝试了这一点,它也会引发同样的错误:

UnicodeEncodeError: 'latin-1' codec can't encode character u'\u014d' in position 75: ordinal not in range(256)

我不确定数据库适配器为什么要在latin-1代替utf-8时使用latin-1对unicode进行编码。最好的解决方案是追踪query = u'''SELECT something FROM some_table WHERE some_name LIKE %s'''.encode('utf-8') args = [u"{this_name}%".format(this_name=list_name).encode('utf-8')] self.dbCursor.execute(query, args) 选择的来源。

一个hacky解决方法是尝试自己编码字符串:

{{1}}

但我要强调,我真的不认为这是最好的方式,也不应该这样做。

答案 1 :(得分:0)

我已经在此处为类似问题添加了答案,您也可以查看它!

链接:https://stackoverflow.com/a/61042304/8939258

答案 2 :(得分:0)

我放弃转义。相反,我用通配符maxToMinArr

替换了单引号
%

它在mysql中完美运行