MySQL 如何转义单引号?掌握这几种方法,避免SQL注入与语法错误
在 MySQL 中,转义单引号最直接、最常用的方法是使用反斜杠(\)进行转义,即在单引号前加上反斜杠,写成 \' 的形式。 这是 MySQL 默认的转义方式,能确保单引号被正确识别为字符串内容,而非字符串的结束边界,正确处理单引号转义是编写安全、可靠数据库应用的基础,它能有效防止SQL注入攻击并避免语法错误。
核心转义方法详解
-
使用反斜杠(\)转义 这是 MySQL 的标准做法,当字符串用单引号包裹时,内部出现的单引号必须转义。

INSERT INTO users (name, bio) VALUES ('O\'Reilly', 'It\'s a great day.');执行后,数据库中存储的值将是
O'Reilly和It's a great day.。 -
使用双单引号('')转义 在 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");
- Python (PyMySQL) 示例:
-
使用官方驱动提供的转义函数:在必须拼接 SQL 的极少数场景下,应使用数据库驱动提供的专用函数:
- PHP (MySQLi):
mysqli_real_escape_string() - Node.js (mysql2):使用连接对象的
escape方法或直接使用参数化查询。
- PHP (MySQLi):
相关函数与模式
-
QUOTE()函数:MySQL 内置函数,直接用单引号包裹字符串并转义内部内容。SELECT QUOTE("It's OK"); -- 输出:'It\'s OK' -
NO_BACKSLASH_ESCAPES模式:如果启用了此 SQL 模式,反斜杠将失去转义功能,作为普通字符,此时转义单引号只能使用双单引号('')方式,此模式不常用,但需要了解。
重要总结与安全建议
- 首要准则:始终使用参数化查询(预编译语句),让驱动自动处理转义问题,这是根治 SQL 注入的唯一有效方法。
- 手动转义:在纯 SQL 环境或无法使用参数化查询的极端情况下,记住使用
\'或 。 - 警惕双重转义:如果错误地先手动添加了反斜杠,又被参数化查询或转义函数处理一次,会导致存储额外的反斜杠,确保转义只发生一次。
- 宽字符集注入:即使使用转义函数,在旧版或配置不当时,宽字符集(如 GBK)可能带来“宽字节注入”漏洞,这再次凸显了使用参数化查询的不可替代性。
理解 \' 这一基本转义规则是必要的,但构建现代应用时,将转义工作交给数据库驱动通过参数化查询自动完成,才是保障安全与稳定的黄金法则。
未经允许不得转载! 作者:HTML前端知识网,转载或复制请以超链接形式并注明出处HTML前端知识网。
原文地址:https://www.html4.cn/14757.html发布于:2026-09-04





