【问题标题】:Python MySQL - MySQLdb - apostrophe in string breaks entryPython MySQL - MySQLdb - 字符串中断条目中的撇号
【发布时间】:2014-09-11 07:56:55
【问题描述】:

您好,我正在将字符串插入一个运行良好的 MySQL 数据库,直到我的一个字符串包含一个撇号,因为它会中断,并且不会在数据库中输入任何内容。它是可能包含奇数字符、撇号、语音标记等的标题字符串。我尝试了 MySQLdb.escape_string(title) 但仍然无法正常工作,可能是我用错了。

insert = "insert into %s (location, mode, process, status, title) values ('%s', '%s', '%s', '%s', '%s')" % (self.params["tableName"], location, transporterMode, "-", "Queued", MySQLdb.escape_string(self.title))
cur.execute(insert)
self.params["db"].commit()

【问题讨论】:

    标签: python mysql database mysql-python


    【解决方案1】:

    这正是你不应该使用字符串插值的原因。 DB API 具有提供字符串参数的详细记录方式,除了解决您的撇号问题外,还可以保护您免受 SQL 注入。

    insert = "insert into {} (location, mode, process, status, title) values (%s, %s, %s, %s, %s)".format(self.params['tableName'])
    cur.execute(insert, (location, transporterMode, "-", "Queued", self.title))
    

    请注意,您不要自己引用占位符,而是将参数集作为第二个参数传递给 cursor.execute。另请注意确实需要对表名使用字符串插值:我使用了较新的 format 语法,因此它不会尝试替换其他占位符。

    【讨论】:

    • 效果很好,谢谢,您错过了最后一行的右括号。再次感谢。
    • 一切都好,但目前当我从数据库中取回值时,字符串中仍然有反斜杠转义字符。
    • 你不能转义你的输入变量。只需使用它们。
    • 我在输入时使用它们,但在回读时不想在我的字符串中使用反斜杠。
    • 谢谢,添加了缺少的括号。不过,我不确定您对反斜杠的含义是什么:听起来这只是 Python shell 中的 repr 。如果你这样做print whatever,看起来还可以吗?如果不是,您可能应该问一个新问题。
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2021-05-19
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多