Node.js 实现 SQL 模糊查询的完整流程与转义处理

作者:沧海时间:2026-10-31 14:58:16浏览:108

本文详细记录了在 Node.js 项目中实现 SQL 模糊查询的过程,重点解决了直接使用字符串拼接导致的语法错误。通过采用参数化查询传递变量,并针对包含通配符 '%' 和 '_' 的用户输入进行手动转义,实现了支持特殊符号的精确模糊匹配。

近期在维护一个基于 Node.js 开发的旧项目,对于长期从事 Java 后端开发的工程师而言,这类代码的维护具有一定挑战性。虽然不修复 Bug 可能意味着需要重构,但为了应对测试人员提出的模糊查询功能需求,只能逐步梳理 Node.js 代码。经过约两小时的资料查阅与调试,最终完成了功能修改,特此记录以便后续回顾。

实验环境

  • 开发工具:VS Code

实验环境

  • 数据库版本:MySQL 8.0.26

修改过程

初始尝试直接进行代码修改。

exports.queryWordsList = function (req, res, next) {
  var Words = DB.get('Words')
  var params = req.body
  var page = new Page({
    pageNum: params.pageNum || 1,
    pageSize: params.pageSize || 10,
  })
  delete params.pageNum
  delete params.pageSize
  var sql = `select t.id,t.name,t.words, t.type,t.tip_msg,t.replace_str,t.desc,
    UNIX_TIMESTAMP(t.create_time)*1000 as create_time,
    UNIX_TIMESTAMP(t.modify_time)*1000 as modify_time
    from t_words t`
  if (params.word) {
    sql = `${sql} WHERE name like '%?%' order by t.modify_time desc`
  } else {
    sql = `${sql} order by t.modify_time desc`
  }
  Words.queryPageBySql(sql,page,[params.word],function (err, result) {
      if (err) {
        res.json({ rescode: '10001', err: err })
        return
      }
      var list = page.list
      res.json({ rescode: '10000', data: result })
    }
  )
}

运行后发现程序报错。

{
    "rescode": "10001",
    "err": {
        "code": "ER_PARSE_ERROR",
        "errno": 1064,
        "sqlMessage": "You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near '其'%' order by t.modify_time desc ) T' at line 4",
        "sqlState": "42000",
        "index": 0,
        "sql": "select count(*) as count from ( select t.id,t.name,t.type,t.tip_msg,t.replace_str,t.desc,\n    UNIX_TIMESTAMP(t.create_time)*1000 as create_time,\n    UNIX_TIMESTAMP(t.modify_time)*1000 as modify_time\n    from t_words t WHERE name like '%'其'%' order by t.modify_time desc ) T"
    },
    "status": false,
    "req_id": "1713148803682.74"
}

因此调整方案,改为通过参数传递查询条件。

exports.queryWordsList = function (req, res, next) {
  var Words = DB.get('Words')
  var params = req.body
  var page = new Page({
    pageNum: params.pageNum || 1,
    pageSize: params.pageSize || 10,
  })
  delete params.pageNum
  delete params.pageSize
  var sql = `select t.id,t.name,t.type,t.tip_msg,t.replace_str,t.desc,
    UNIX_TIMESTAMP(t.create_time)*1000 as create_time,
    UNIX_TIMESTAMP(t.modify_time)*1000 as modify_time
    from t_words t`
  if (params.word) {
    sql = `${sql} WHERE name like ? order by t.modify_time desc`
  } else {
    sql = `${sql} order by t.modify_time desc`
  }
  var queryWord = "%" + params.word + "%";
  Words.queryPageBySql(sql,page,[queryWord],function (err, result) {
      if (err) {
        res.json({ rescode: '10001', err: err })
        return
      }
      var list = page.list
      res.json({ rescode: '10000', data: result })
    }
  )
}

测试确认可以正常执行查询,但发现当传入如“其%”这类包含通配符的字符串时,SQL 语句直接将其中的 '%' 视为关键字处理,导致特殊符号被忽略。为解决此问题,需引入转义字符机制,暂时采用以下处理方式。

sql = `${sql} WHERE name LIKE ? ESCAPE '\\' ORDER BY t.modify_time DESC`;
var queryWord = "%" + params.word.replace(/\\/g, "\\\\").replace(/%/g, "\\%") + "%";

至此,关于 Node.js 实现 SQL 模糊查询的详细过程介绍完毕。如需了解更多 Node.js 与 SQL 模糊查询相关内容,建议查阅本站往期文章或继续浏览后续教程,感谢大家的支持。

作者最新文章