小编典典

Python具有挑战性的字符串编码

sql

我有以下提供商列表(俄语):

providers = [u'\u041e\u041e\u041e "\u041a\u0432\u0430\u0440\u0442\u0430\u043b 
            \u041b\u0435\u043e\u043f\u043e\u043b\u0438\u0441"', 
            u'\u0426\u0435\u043d\u0442\u0440\u0430\u043b']

这些显然是在unicode中。以前,要执行SQL SELECT,我正在做:

providers = tuple([str(item) for item in providers])
sql += " WHERE provider IN {} GROUP BY date ORDER BY date ASC".format(repr(providers))
cursor.execute(sql,)

现在,由于列表项使用的是unicode,因此我遇到了UnicodeEncodeError

我将如何正确执行此sql语句?


阅读 167

收藏
2021-04-14

共1个答案

小编典典

您不应该.format()用来在sql查询中包含值。改用sql参数:

sql += " WHERE provider IN ({}) GROUP BY date ORDER BY date ASC".format(', '.join(['%s'] * len(providers)))

cursor.execute(sql, providers)

providers原始清单在哪里。

想法是in使用与列表中提供者数量匹配的SQL参数语法,通过测试生成SQL查询:WHERE provider in (%s, %s) ...对于两个提供者的列表。是的,MySQLdb sql参数语法与老式的python格式语法相呼应,但不是同一回事。

2021-04-14