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
相关产品推荐
相关产品推荐

