我有一个在循环中运行的查询字符串,并且列表查询中的每个项都被执行。该列表包含字符串,我使用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'>
答案 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
中的query
是parameter marker。它将被args
中给出的引用参数替换。要使用的正确参数标记取决于您的数据库适配器。例如,MySQLdb使用%s
,而oursql和sqlite3使用?
。
建议使用参数化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
,但args
是unicode
的列表。我不确定你为什么要编码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)
我已经在此处为类似问题添加了答案,您也可以查看它!
答案 2 :(得分:0)
我放弃转义。相反,我用通配符maxToMinArr
%
它在mysql中完美运行