python%s格式说明符无法用于utf-8值

python%s格式说明符无法用于utf-8值,python,mysql,utf-8,Python,Mysql,Utf 8,我有以下将数据推送到db的python代码: cursor.execute("INSERT INTO "+ DATA_TABLE + """ (fk_id, title, streetaddress,json) values (%(fk_id)s, %(title)s, %(address)s, %(json)s ) """ ,( result)) 但我得到了一个错误: File "/usr/lib/pymodules/

我有以下将数据推送到db的python代码:

cursor.execute("INSERT INTO "+ DATA_TABLE + """ (fk_id, title, streetaddress,json) 
                 values (%(fk_id)s, %(title)s, %(address)s, %(json)s ) """ ,(
                 result))
但我得到了一个错误:

  File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 185, in unicode_literal
    return db.literal(u.encode(unicode_literal.charset))
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-5: ordinal not in range(256)
是因为%s希望值是有效的拉丁语-1字符串,而dict给它一个utf-8字符串吗?什么是干净的解决办法


注意:json是使用
json.dumps
安全创建的。它有几个不同语言的字符。

您应该尝试将所有字符串转换为unicode

cursor.execute(u"INSERT INTO "+ unicode(DATA_TABLE) + u""" (fk_id, title, streetaddress,json) 
                 values (%(fk_id)s, %(title)s, %(address)s, %(json)s ) """ ,(
                 result))

并按中的指定传递charset=“utf-8”进行连接,我认为这不是python%s格式代码的问题。根据,它可以格式化unicode而无需麻烦。但是,请注意,生成的字符串将是unicode


您是否查看了所有相关问题,例如?

谢谢@xaview-combelle的回答,但这不起作用。我仍然收到
UnicodeEncodeError:“latin-1”编解码器无法在同一行上对位置0-5的字符进行编码:序号不在范围(256)
。-1:不要像这样构建SQL语句。Google搜索“Little Bobby Tables”,看看会发生什么。@S.Lott:假设
DATA\u TABLE
变量不是来自用户输入,则此代码不易受SQL注入的攻击。@LukeWoodward:虽然您的假设通常是正确的,但不正确的时间是致命的。而且,像这样构建SQL效率很低。在API中使用正确的值绑定意味着RDBMS后端使用一个标准化的查询来绑定值。这节省了解析时间,并且(有时)可以显著提高性能。@S.Lott Yes\u表不是来自用户。它是一个系统定义的变量,保证有安全值。我需要这样做,因为如果我将
结果['data\u table']=data\u table
“插入到%(data\u table)s…
,我会得到错误:
(1064,”您的SQL语法有错误…在“my_data_table”(我的数据表)附近
Dynamic SQL with the the fly table names通常是一种设计味道。如果没有更多信息,我只能(再次)建议这通常是一个坏主意。