MySQL 如何转义单引号?掌握这几种方法,避免SQL注入与语法错误

在 MySQL 中,转义单引号最直接、最常用的方法是使用反斜杠(\)进行转义,即在单引号前加上反斜杠,写成 \' 的形式。 这是 MySQL 默认的转义方式,能确保单引号被正确识别为字符串内容,而非字符串的结束边界,正确处理单引号转义是编写安全、可靠数据库应用的基础,它能有效防止SQL注入攻击并避免语法错误。

核心转义方法详解

  1. 使用反斜杠(\)转义 这是 MySQL 的标准做法,当字符串用单引号包裹时,内部出现的单引号必须转义。

    mysql 如何转义单引号,MySQL单引号转义技巧详解

    INSERT INTO users (name, bio) VALUES ('O\'Reilly', 'It\'s a great day.');

    执行后,数据库中存储的值将是 O'ReillyIt's a great day.

  2. 使用双单引号('')转义 在 SQL 标准中,也可以通过连续两个单引号来转义,MySQL 同样支持此方法。

    INSERT INTO users (name) VALUES ('Mr''Smith');

    数据库中存储为 Mr'Smith,这种方法在编写兼容其他数据库的 SQL 脚本时可能有用。

在应用程序中安全处理转义

绝对不应该手动拼接字符串来构建 SQL 语句,这是导致 SQL 注入漏洞的主要原因,正确做法是:

  • 使用参数化查询(预编译语句):这是首选的最佳实践,数据库驱动会自动处理转义,无需手动干预。

    • Python (PyMySQL) 示例
      cursor.execute("INSERT INTO articles (title) VALUES (%s)", ("Let's learn MySQL",))
    • PHP (PDO) 示例
      $stmt = $pdo->prepare("INSERT INTO articles (title) VALUES (?)");
      $stmt->execute(["Let's learn MySQL"]);
    • Java (JDBC) 示例
      PreparedStatement stmt = conn.prepareStatement("INSERT INTO articles (title) VALUES (?)");
      stmt.setString(1, "Let's learn MySQL");
  • 使用官方驱动提供的转义函数:在必须拼接 SQL 的极少数场景下,应使用数据库驱动提供的专用函数:

    • PHP (MySQLi)mysqli_real_escape_string()
    • Node.js (mysql2):使用连接对象的 escape 方法或直接使用参数化查询。

相关函数与模式

  • QUOTE() 函数:MySQL 内置函数,直接用单引号包裹字符串并转义内部内容。

    SELECT QUOTE("It's OK"); -- 输出:'It\'s OK'
  • NO_BACKSLASH_ESCAPES 模式:如果启用了此 SQL 模式,反斜杠将失去转义功能,作为普通字符,此时转义单引号只能使用双单引号('')方式,此模式不常用,但需要了解。

重要总结与安全建议

  1. 首要准则始终使用参数化查询(预编译语句),让驱动自动处理转义问题,这是根治 SQL 注入的唯一有效方法。
  2. 手动转义:在纯 SQL 环境或无法使用参数化查询的极端情况下,记住使用 \' 或 。
  3. 警惕双重转义:如果错误地先手动添加了反斜杠,又被参数化查询或转义函数处理一次,会导致存储额外的反斜杠,确保转义只发生一次。
  4. 宽字符集注入:即使使用转义函数,在旧版或配置不当时,宽字符集(如 GBK)可能带来“宽字节注入”漏洞,这再次凸显了使用参数化查询的不可替代性

理解 \' 这一基本转义规则是必要的,但构建现代应用时,将转义工作交给数据库驱动通过参数化查询自动完成,才是保障安全与稳定的黄金法则

未经允许不得转载! 作者:HTML前端知识网,转载或复制请以超链接形式并注明出处HTML前端知识网

原文地址:https://www.html4.cn/14757.html发布于:2026-09-04