【问题标题】:MySQL QUOTE() vs mysql_real_escape_string()?MySQL QUOTE() 与 mysql_real_escape_string()?
【发布时间】:2012-07-23 10:34:03
【问题描述】:

在 MySQL 中,QUOTE()mysql_real_escape_string() 有什么区别?从 MySQL 文档中,我知道以下内容:

QUOTE()

  • 写入 SQL 查询
  • 转义反斜杠、单引号、NUL、CTRL+Z
  • 返回单引号字符串
  • 行为依赖于 MySQL 服务器的字符集

mysql_real_escape_string()

  • 在执行查询之前用 C/C++ 编写,允许在提交之前读取/修改转义字符串
  • QUOTE()相比使用起来非常不方便
  • 转义反斜杠、单引号、NUL、CTRL+Z 和 双引号、\n 和 \r
  • 显然添加了更多引号以使字符在日志文件中易于阅读
  • 行为依赖于 MySQL 服务器的字符集

忽略日志,转义\n\r 字符有用吗?有了这两个功能,客户端/服务器功能效率有区别吗?如果开发人员希望在输入查询之前处理转义字符串,mysql_real_escape_string() 听起来很有用。但是,QUOTE() 没有提供最安全可靠的字符串转义方法吗?

我想知道是否应该将QUOTE() 用于所有语言的所有查询,而忘记使用特定于语言的函数转义字符串。


【问题讨论】:

    标签: c++ mysql c


    【解决方案1】:

    QUOTE() 似乎是要在构造其他 SQL 语句的 SQL 语句中使用。如果您不在 SQL 范围内,则应使用 mysql_real_escape_string()

    [...] 在 C 程序中,您可以使用 mysql_real_escape_string() C API 函数来转义字符。 [...] 在构造其他 SQL 语句的 SQL 语句中,您可以使用 QUOTE() 函数。

    正如String Literals (MySQL Manual)底部的解释。

    【讨论】:

      【解决方案2】:

      QUOTE() 已经在查询中,所以它就像你没有放任何东西一样容易突破。 mysql_real_escape_string 对于让任意字符串安全地插入查询至关重要。

      使用某种别名可以很容易地解决函数名笨拙的问题。我不是 C/C++ 用户,但它没有宏,你可以用它来编写你想要的任何东西,它会被长函数名替换吗?

      【讨论】:

      • 所以QUOTE() 不是注射安全的? QUOTE() 什么时候适合使用?我担心的是功能,而不是便利。你说的也是正确的,因为 C++ 有宏。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多