Escape字符串Python for MySQL

Lau*_*ălu 64 python mysql escaping

我使用Python和MySQLdb下载网页并将它们存储到数据库中.我遇到的问题是我无法在数据库中保存复杂的字符串,因为它们没有被正确转义.

我可以使用Python中的函数来转义MySQL的字符串吗?我试过'''(三个简单的引号)""",但它没有用.我知道PHP有mysql_escape_string()类似的东西吗?

谢谢.

mik*_*iku 85

conn.escape_string()
Run Code Online (Sandbox Code Playgroud)

请参阅MySQL C API函数映射:http://mysql-python.sourceforge.net/MySQLdb.html

  • _mysql.escape_string("input's")也可以用于转义mysql的ascii字符串.显然不是为了unicode._mysql.escape_string(你是"输入的éh") (4认同)
  • 不起作用...将字符串转换为字节格式 (4认同)
  • +1 ...完美答案。惊讶地看到这么多复杂的答案。显然,参数查询不考虑存储的长字符串(文本)。 (2认同)
  • +1我喜欢用脏话和代码书写的黑白HTML页面。 (2认同)

Use*_*ser 58

MySQLdb库实际上会为您执行此操作,如果您使用它们的实现来构建SQL查询字符串而不是尝试构建自己的SQL查询字符串.

不要这样做:

sql = "INSERT INTO TABLE_A (COL_A,COL_B) VALUES (%s, %s)" % (val1, val2)
cursor.execute(sql)
Run Code Online (Sandbox Code Playgroud)

做:

sql = "INSERT INTO TABLE_A (COL_A,COL_B) VALUES (%s, %s)"
cursor.execute(sql, (val1, val2))
Run Code Online (Sandbox Code Playgroud)

  • bozdoz,这非常符合设计,因为它可以防止SQL注入.如果要插入条件表,首先要确保用户提交的字符串无法用于表名,然后直接将其添加到查询中. (4认同)
  • 有点不高兴,它会强制引号.例如,如果要插入条件表(TABLE_A而不是"TABLE_A"),则无法使用此方法完全执行此操作. (3认同)
  • 这绝对是正确的答案。永远不知道有什么新方法可以绕过字符串转义(就像我们目前在 PHP 世界中所做的那样......)。总是做准备好的语句更安全 (2认同)

Mar*_*oma 9

>>> import MySQLdb
>>> example = r"""I don't like "special" chars ¯\_(?)_/¯"""
>>> example
'I don\'t like "special" chars \xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf'
>>> MySQLdb.escape_string(example)
'I don\\\'t like \\"special\\" chars \xc2\xaf\\\\_(\xe3\x83\x84)_/\xc2\xaf'
Run Code Online (Sandbox Code Playgroud)

  • Python3 的 MySQLdb 分支:https://github.com/PyMySQL/mysqlclient-python (3认同)