SQL参数化查询中LIKE模糊匹配的单引号语法错误解决方法
解决参数化查询中LIKE模糊匹配的语法错误问题
嗨,这个问题我之前踩过一模一样的坑!核心原因是参数化查询的安全机制——它会自动给参数值包裹单引号来防止SQL注入,但这就导致你直接在SQL里写%?%时,最终生成的语句变成了%'word'%,单引号的位置完全不符合语法要求,数据库自然会报错。
给你两个安全又有效的解决方案,都能避开手动拼接SQL带来的注入风险:
方案1:在应用层给参数值拼接%
保持SQL语句简洁,只保留参数占位符:
SELECT * FROM table_name WHERE column_name LIKE ?
然后在传入参数的时候,把要搜索的关键词和%拼接好就行。比如你要搜"word",就传入%word%作为参数值(不用手动加单引号,参数化机制会自动处理)。举个Node.js用mysql2驱动的例子:
const keyword = 'word'; const sql = 'SELECT * FROM table_name WHERE column_name LIKE ?'; const [rows] = await connection.execute(sql, [`%${keyword}%`]);
这种方式逻辑清晰,也是最推荐的参数化写法,能完整保留防注入的安全特性。
方案2:在SQL语句里用CONCAT函数拼接%
如果不想在应用层处理,也可以让数据库帮你完成拼接,用CONCAT函数把%和参数值连起来:
SELECT * FROM table_name WHERE column_name LIKE CONCAT('%', ?, '%')
数据库会自动把参数值(比如"word")和前后的%拼接成%word%,再执行模糊匹配,同样不会有语法问题,而且全程都是安全的参数化查询。
⚠️ 千万不要直接拼接SQL字符串!比如写SELECT * FROM table_name WHERE column_name LIKE '%${keyword}%',这种写法会把用户输入直接拼进SQL,极易触发SQL注入攻击,绝对要避免。
内容的提问来源于stack exchange,提问作者Nothere
相关产品推荐
相关产品推荐

