【问题标题】:special characters in MySQL causing errorMySQL中的特殊字符导致错误
【发布时间】:2021-01-09 22:48:14
【问题描述】:

下图显示了一个代码sn-p:

            query="insert into mytable values ('%s','%s','%s','%s',%s,'%s')"
            value=(str(cr),str(cs),str(srv),str(cl),recipe["total_time"],image,name)
            print(name)
            cursor.execute(query%value)
            mydb.commit()

我添加了一个 print(name) 语句来显示“name”变量的确切含义。 (它是一个字符串)。在运行时,我收到一个错误:

“paneer ki sabji | ..”是名称的值。我将“name”中的数据插入到 mysql 表中,在“nvarchar”类型的列下。

错误是因为特殊字符“|”吗?如果是,我们如何解决它,为什么“nvarchar”没有处理它?

【问题讨论】:

  • 停止使用字符串格式来构建查询。我厌倦了这样说;它容易出错并且对 SQL 注入开放。查找参数化
  • 如果你没有发布图片,我可以给你固定的代码,顺便说一句。这将是复制/粘贴并仅对其进行编辑的情况。但是您没有将代码作为文本提供
  • @roganjosh 如果是这样的话,我会把它写成文本。
  • 对于所有问题,您都应该始终将代码作为文本发布。否则,您会期望人们再次为您输入所有内容(没有充分理由)
  • MySQL 不应该有特殊字符的问题,是什么让您认为是导致问题的名称?其他字段的格式是什么,尤其是recipe["total time"]和image?

标签: python mysql string


【解决方案1】:

与特殊字符无关。你犯了和你之前很多人一样的错误; %s old-style string formatting 使用相同。 不要使用字符串格式将参数插入查询 - 这对 SQL 注入开放。不幸的是,DB API 还将%s 指定为有效:https://www.python.org/dev/peps/pep-0249/#paramstyle。另见MySQL parameterized queries

现在还有一个问题:

query="insert into mytable values ('%s','%s','%s','%s',%s,'%s')"

数一下%s。有 6 个。现在数:

(str(cr),str(cs),str(srv),str(cl),recipe["total_time"],image,name)

这是一个包含 7 个值的元组。那么你如何期望它与 6 个占位符一起工作呢?如果recipespd.Series,那么您会遇到更多问题,但希望不是。

我猜的答案:

query="INSERT INTO mytable VALUES ('%s', '%s', '%s', '%s', '%s, '%s', '%s')"
value=(str(cr), str(cs), str(srv), str(cl), recipe["total_time"], image, name)
cursor.execute(query, value)

【讨论】:

    【解决方案2】:

    我认为问题在于“查询”和“值”变量之间缺少空格。 超过这个

    • 从 Python 的角度来看,这是格式化字符串的旧方法
    • 从安全的角度来看这是不行的

    实际的做法是:

    query = "INSERT INTO mytable VALUES(?,?,?,?)" 
    cursor.execute(query, [ 
        str(cr),str(cs),str(srv),str(cl),recipe["total_time"],image,name
    ])
    

    reference 的身份查看。

    【讨论】:

    • 这不是“空格”(他们实际上使用%)。他们试图调用旧样式的字符串格式,而不是参数化
    • 它现在给我一个错误“并非所有参数都在 sql 语句中使用”
    • 发生这种情况是因为您没有为所有字段指定值,我确实少写了“?”比需要的..让我们将sintax修改为:query = "INSERT INTO mytable VALUES(?,?,?,?,?,?,?)"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2012-03-06
    • 2021-11-22
    相关资源
    最近更新 更多