You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js操作MySQL时LIKE查询语法错误问题求助

解决Node.js中MySQL LIKE查询的语法错误问题

我来帮你搞定这个LIKE查询的语法问题——你遇到的错误根源是参数化查询的用法不对,咱们一步步来修正:

首先看你出错的原因:你在SQL里写了N'%?%',这会让MySQL把?当成普通字符串的一部分,而不是参数占位符。再加上参数化查询自动给你的test加上引号,就生成了'%'test'%'这种嵌套引号的错误结构,直接触发语法报错。

下面是两种靠谱的解决办法:

方法1:在JS参数里拼接通配符

把%直接拼接到要查询的字符串上,SQL里只保留纯净的占位符?,这样参数化查询会正确处理整个字符串:

data = {}; 
data.fullname = 'test'; 
data.start = 0; 
data.limit = 10; 

let getFullname = function (data, callback) {
  // 把通配符和查询字符串拼在一起
  const searchKeyword = `%${data.fullname}%`;
  return db.query(
    "SELECT * FROM user WHERE fullname LIKE ? ORDER BY create_time DESC LIMIT ?,? ",
    [searchKeyword, data.start, data.limit],
    callback
  );
}

这样生成的SQL会变成:

SELECT * FROM user WHERE fullname LIKE '%test%' ORDER BY create_time DESC LIMIT 0,10

完全符合语法要求,同时还能避免SQL注入的风险。

方法2:在SQL中用CONCAT函数拼接

如果不想在JS代码里处理字符串拼接,也可以把拼接逻辑放到SQL语句里,用CONCAT函数把%和占位符拼起来:

data = {}; 
data.fullname = 'test'; 
data.start = 0; 
data.limit = 10; 

let getFullname = function (data, callback) {
  return db.query(
    "SELECT * FROM user WHERE fullname LIKE CONCAT('%', ?, '%') ORDER BY create_time DESC LIMIT ?,? ",
    [data.fullname, data.start, data.limit],
    callback
  );
}

这种方式同样能生成正确的SQL,适合把通配符逻辑统一放在SQL层面的场景。

另外补充个小细节:如果你的数据库用的是utf8mb4这类Unicode字符集,其实不需要加N前缀,MySQL会自动处理Unicode字符串。如果确实需要用N前缀,正确写法是N?,然后把带%的字符串作为参数传入,比如N?配合%test%参数,会生成N'%test%',不会出现嵌套引号的问题。

内容的提问来源于stack exchange,提问作者Social Code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:38:57