在mysql数据库开发中,写sql语句时难免要处理用户输入或者文本中带有的特殊字符,例如单引号、双引号、反斜杠、换行符以及百分号和下划线等。如果这些字符直接拼接到sql里,轻则语句报错,重则引发sql注入风险。掌握mysql写sql语句的转义方法是每个开发者必备的基础能力。

为什么sql语句需要转义特殊字符
mysql把单引号当作字符串的边界,如果字符串内容里本身包含一个未处理的单引号,解析器会提前结束字符串,导致后续内容被当成sql指令。类似地,反斜杠在mysql里是转义符,百分号和下划线在like查询里是通配符。因此我们必须用正确的方式告诉mysql哪些字符应当被当作普通文本。
使用反斜杠手动转义
最基础的写sql语句的转义方法是在特殊字符前加反斜杠。mysql识别的常见转义序列包括'、"、\、n、r、t等。下面示例向用户表插入带单引号和换行的昵称:
-- 手动用反斜杠转义单引号和换行
INSERT INTO user (nickname) VALUES ('O'BriennHello');
在like查询中,若想匹配字面意义的百分号或下划线,也要用反斜杠处理:
-- 查找以百分号开头的商品名 SELECT * FROM product WHERE name LIKE '%%';
使用QUOTE函数自动转义
mysql提供了QUOTE()函数,它会对字符串加外层单引号,并对其中的特殊字符自动转义,非常适合在拼接动态sql时使用。
-- QUOTE函数返回带引号和转义后的字符串
SELECT QUOTE("Tom's book");
-- 结果: 'Tom's book'
通过预处理语句避免手写转义
更推荐的做法是使用预处理语句(prepared statement),把参数和sql结构分开,由mysql驱动完成绑定,从根本上不需要手动写sql语句的转义。示例如下:
-- 预处理插入语句 PREPARE stmt FROM 'INSERT INTO user (nickname) VALUES (?)'; SET @name = 'O'Brien'; EXECUTE stmt USING @name; DEALLOCATE PREPARE stmt;
不同客户端语言的转义函数
在程序代码里拼sql前,应使用对应语言提供的转义函数,例如php的mysqli_real_escape_string(),它们遵循当前mysql连接的字符集规则。但最佳方案仍是使用参数化查询,而非依赖转义函数。
| 场景 | 推荐方式 |
|---|---|
| 临时手动执行sql | 反斜杠或QUOTE函数 |
| 应用程序写sql | 预处理语句参数绑定 |
| like模糊匹配特殊符 | ESCAPE子句自定义转义符 |
使用ESCAPE自定义转义符
如果反斜杠本身在数据中频繁出现,可以用like的escape子句指定别的转义字符:
-- 用竖线作为转义符,匹配真实下划线 SELECT * FROM file WHERE path LIKE '%|_data%' ESCAPE '|';
综上,mysql输入特殊字符并处理sql转义,既可以手写反斜杠、借助quote函数,也能用预处理语句彻底规避问题。理解这些写sql语句的转义方法,能让你写出更安全稳健的数据库代码。