Python:从MySQL查询中转义单引号

Python:从MySQL查询中转义单引号,python,unicode,utf-8,mysql-python,Python,Unicode,Utf 8,Mysql Python,我有一个查询字符串,它在循环中运行,对于列表中的每个项目,都会执行查询。该列表包含字符串,我使用python字符串格式技术将查询替换为迭代过程中列表中的相应字符串 我已将查询与列表中的字符串联合起来:这是我的联合查询: query = ur'''SELECT something FROM some_table WHERE some_name LIKE "{this_name}%"''' 在执行之前,我将查询字符串编码为utf-8 但问题是,有时我会遇到列表中有单引号的字符串示例:foo's。我

我有一个查询字符串,它在循环中运行,对于列表中的每个项目,都会执行查询。该列表包含字符串,我使用python字符串格式技术将查询替换为迭代过程中列表中的相应字符串

我已将查询与列表中的字符串联合起来:这是我的联合查询:

query = ur'''SELECT something FROM some_table WHERE some_name LIKE "{this_name}%"'''
在执行之前,我将查询字符串编码为utf-8

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

我的下一次尝试是替换单一报价:

format_string = u"foo's".replace(u"'",u"\'")
但这也不起作用。我还看到,答案是使用mysqldb库的内置功能,我不知道,所以我寻求stackoverflow社区的帮助来解决这个问题

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

args = [u"{this_name}%".format(this_name=format_name)]
self.dbCursor.execute(query.encode('utf-8'), args)
在此行引发错误:

错误:

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

this_name= Sentōkisei type= <type 'unicode'>
如果使用两个参数调用dbCursor.execute,DB适配器将为您引用这些参数。有关详细信息,请参见:

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是一个。它将替换为args中给定的带引号的参数。要使用的正确参数标记取决于您的DB适配器。例如,使用%s,而使用

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

关于这个错误,你可以发布它

this_name= Sentōkisei type= <type 'unicode'>
将使args成为包含一个unicode的列表

现在我们到达引起错误的那一行:

self.dbCursor.execute(query.encode('utf-8'), args)
查询已经是unicode。如果对该unicode进行编码,则它将成为一个str.So query.encode'utf-8'是一个str,而args是一个unicode列表。我不知道为什么要对查询进行编码,但您的DB适配器应该能够接受两个unicode参数。所以试试看

self.dbCursor.execute(query, args)
现在,在重新阅读您的评论时,您似乎已经尝试了此操作,并且还引发了相同的错误:

UnicodeEncodeError: 'latin-1' codec can't encode character u'\u014d' in position 75: ordinal not in range(256)
我不知道为什么DB适配器在您需要utf-8时尝试用拉丁语-1编码unicode。最好的解决办法是找出拉丁语-1的选择来源

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

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)
但我要强调的是,我真的不认为这是最好的方法,也不认为这是必要的

如果使用两个参数调用dbCursor.execute,DB适配器将为您引用这些参数。有关详细信息,请参见:

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是一个。它将替换为args中给定的带引号的参数。要使用的正确参数标记取决于您的DB适配器。例如,使用%s,而使用

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

关于这个错误,你可以发布它

this_name= Sentōkisei type= <type 'unicode'>
将使args成为包含一个unicode的列表

现在我们到达引起错误的那一行:

self.dbCursor.execute(query.encode('utf-8'), args)
查询已经是unicode。如果对该unicode进行编码,则它将成为一个str.So query.encode'utf-8'是一个str,而args是一个unicode列表。我不知道为什么要对查询进行编码,但您的DB适配器应该能够接受两个unicode参数。所以试试看

self.dbCursor.execute(query, args)
现在,在重新阅读您的评论时,您似乎已经尝试了此操作,并且还引发了相同的错误:

UnicodeEncodeError: 'latin-1' codec can't encode character u'\u014d' in position 75: ordinal not in range(256)
我不知道为什么DB适配器在您需要utf-8时尝试用拉丁语-1编码unicode。最好的解决办法是找出拉丁语-1的选择来源

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

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)

但我要强调的是,我真的不认为这是最好的方法,也不认为这是必要的

我在这里添加了一个类似问题的答案,你也可以看一下


链接:

我在这里添加了一个类似问题的答案,你也可以看看


链接:

我放弃逃避它。相反,我用通配符替换了单引号,通配符为%


它在mysql中工作得非常好

我放弃了转义它。相反,我用通配符替换了单引号,通配符为%


它在mysql中工作得很好

如果删除原始标志会发生什么?我真的不明白你的意思如果删除原始标志会发生什么?我真的不明白你的意思所以,我不需要这样做:encoded_q=formatted_query.encode'utf-8'?关于Unicode,我认为{this_name}%需要替换为u{this_name}%。我这样认为是因为使用建议的解决方案,我得到了如下结果:`UnicodeEncodeError:'ascii'编解码器无法对位置1中的字符u'\xf3'进行编码:序号不在范围128中,因为我必须处理类似Hój类型的字符串=但我检查
该类型和我在此之前已对其进行了Unicode编码。@unutbu实际上我用您的解决方案运行了我的代码,并与我的代码进行了比较,以查看它们在同一字符串中的失败位置:Unicode DeencodeError:“latin-1”编解码器无法对位于75位置的字符u'\u014d'进行编码:序号不在256格式范围内。\u奇怪的用户=发送的ōkisei类型=我也做了小的编码对你的代码进行了修改,但我认为这并没有什么不同。我编辑了答案以反映这一点。请发布您正在运行的修订代码,以及完整的回溯错误消息。它会告诉我们,除其他外,是哪一行产生了错误。所以,我不需要这样做:encoded_q=formatted_query.encode'utf-8'?关于Unicode,我认为{this_name}%需要替换为u{this_name}%。我这样认为是因为使用建议的解决方案,我得到了如下结果:`UnicodeEncodeError:'ascii'编解码器无法对位置1中的字符u'\xf3'进行编码:序号不在范围128中,因为我必须处理像Hój type=这样的字符串,但我检查了类型,并在此之前对其进行了Unicode编码。@unutbu实际上我用您的解决方案运行了我的代码,并且与我的相比,它们在同一个字符串上都失败了:UnicodeEncodeError:“latin-1”编解码器无法对75位的字符u'\u014d'进行编码:序号不在256格式的范围内。\u strange_user=Sentōkisei type=我也对您的代码做了一些小改动,但我认为这并没有什么区别。我编辑了答案以反映这一点。请发布您正在运行的修订代码,以及完整的回溯错误消息。它将告诉我们,除其他外,确切地说是哪条线产生了错误。