Knex.js中使用ilike绑定URL字符串时如何转义特殊字符?
解决Knex.js中Postgres ilike查询变量绑定失效问题
问题核心
直接将变量通过模板字符串拼接进whereRaw的SQL语句中,虽然控制台显示的SQL和写死字符串的版本一致,但实际执行时Postgres的字符串转义逻辑、Knex的参数处理规则会导致查询不匹配;同时这种写法存在SQL注入风险。
正确解决方案
方法1:使用whereRaw的参数绑定(推荐)
通过Knex的参数占位符传递变量,自动处理特殊字符转义,避免SQL注入:
const url = 'domain.com/path-string-here/'; knex("table") .select() .whereRaw("column_name ilike ?", [`%${url}%`])
方法2:使用Knex内置的whereILike方法
Knex提供了专门适配ilike的方法,无需手动编写原生SQL:
const url = 'domain.com/path-string-here/'; knex("table") .select() .whereILike('column_name', `%${url}%`)
方法3:用knex.raw构造参数化查询
适合需要复杂SQL组合的场景,同样通过参数占位符传递变量:
const url = 'domain.com/path-string-here/'; knex("table") .select() .where(knex.raw('column_name ilike ?', [`%${url}%`]))
关键注意事项
- 若变量
url中包含%、_这类ilike通配符,参数绑定方式会自动转义,确保它们被当作普通文本匹配,而非匹配规则 - 绝对禁止直接用模板字符串拼接变量到SQL语句中,这不仅会引发匹配问题,还会带来SQL注入风险
内容的提问来源于stack exchange,提问作者Jim Burch
相关产品推荐
相关产品推荐

