【发布时间】:2011-12-29 13:15:37
【问题描述】:
我有以下将数据推送到数据库的 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 期望 value 是一个有效的 latin-1 字符串,而 dict 给它一个 utf-8 字符串?什么是干净的解决方法?
注意:json 是使用json.dumps 安全创建的。它有几个不同语言的字符。
【问题讨论】:
-
-1:不要像这样构建 SQL 语句。谷歌“小鲍比桌”看看会发生什么。
-
@S.Lott:假设
DATA_TABLE变量不是来自用户输入,则此代码不易易受 SQL 注入攻击。 -
@LukeWoodward:虽然您的假设通常是正确的,但它不正确的时间是致命的。此外,像这样构建 SQL 效率低下。在 API 中使用正确的值绑定意味着 RDBMS 后端与绑定了值的单个标准化查询一起工作。这可以节省解析时间,并且(有时)可以显着提高性能。
-
@S.Lott 是的 DATA_TABLE 不是来自用户。它是一个系统定义的变量,保证具有安全值。我需要这样做,因为如果我写
result['data_table'] = DATA_TABLE和"""INSERT INTO %(data_table)s ...,我会得到错误:(1064, "You have an error in your SQL syntax... near ''my_data_table' -
带有动态表名的动态 SQL 通常是一种设计味道。如果没有更多信息,我只能(再次)建议这通常是一个坏主意。