【问题标题】:Writing a simple query, getting a unicodeEncodeError, python 2.7写一个简单的查询,得到一个unicodeEncodeError,python 2.7
【发布时间】:2014-12-21 13:08:07
【问题描述】:

查询:

query = "SELECT * from "+str(tablename)+" where user='"+str(user)+"' AND review_title='"+rt+"'"

错误信息:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 3: ordinal not in range(128)

代码:

rt = review_title.replace("'", "\\'")
rt = rt.replace('"', '\\"')
rt = unicode(rt).encode('utf-8')
query = "SELECT * from "+str(tablename)+" where user='"+str(user)+"' AND review_title='"+rt+"'"

在这种情况下,表名是 'ta_rest_review'user'KANNONEPL...'rt'Excelente pero \"OJO a la CUENTA\"'

【问题讨论】:

  • 您的值中有一个 é 字符,但您的示例输入缺少该字符。
  • 在报告 Python 问题时,总是包含回溯。如果它是实际的 query 分配,那么带重音符号的 é 字符位于 usertablename 值中。
  • 在这种情况下,UnicodeEncodeError 的问题是由在具有有效 ASCII 范围之外的字符的 unicode 对象上调用 str() 引起的,这与 post you commented on earlier 完全不同。

标签: python python-2.7 character-encoding


【解决方案1】:

您应该使用字符串格式来插入您的数据。请改用 SQL 参数!

为您的数据库驱动程序使用适当的查询参数语法,它将使用问号或%s 占位符:

cursor.execute(
    'SELECT * from {0} WHERE user=%s AND review_title=%s'.format(tablename),
    (user, rt)
)

您仍然需要插入表名(绝对确定这是一个现有的表名,不要通过用户输入来确定这一点!)

然后,数据库驱动程序可以为您正确转义 userrt 值,包括将 Unicode 值编码为数据库支持的编码。

此外,如果您尝试自己“转义”您的数据库输入,您可以避免冒 SQL 注入安全漏洞的风险。

查看您的数据库驱动程序文档;该模块应该有一个paramstyle variable,它定义了驱动程序支持的参数占位符的样式,并说明是否支持多种样式。

【讨论】:

  • 成功了,感谢您的回答。奇怪的是我以前在这里找不到它。
猜你喜欢
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2010-10-15
  • 2018-05-27
相关资源
最近更新 更多