Python挑战字符串编码

时间:2012-12-07 20:34:09

标签: python mysql 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语句?

1 个答案:

答案 0 :(得分:4)

您不应该使用.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格式化语法相呼应,但不是一回事。