【问题标题】:python %s format specifier failing for utf-8 valuespython %s 格式说明符对于 utf-8 值失败
【发布时间】: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 通常是一种设计味道。如果没有更多信息,我只能(再次)建议这通常是一个坏主意。

标签: python mysql utf-8


【解决方案1】:

您应该尝试将所有字符串转换为 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" 以按照http://mysql-python.sourceforge.net/MySQLdb.html 中指定的方式进行连接

【讨论】:

  • 感谢@xaview-combelle 的回答,但这不起作用。我仍然在同一行收到UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-5: ordinal not in range(256)
【解决方案2】:

我认为这不是 python %s 格式化代码的问题。根据python string formatting documentation,它可以格式化unicode而不会遇到麻烦。但是请注意,生成的字符串将是 unicode。

您是否查看过所有相关问题,例如How to make MySQL handle UTF-8 properly?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2010-11-03
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多