MySQL参数化绑定LIMIT执行分页查询报SQL语法错误如何解决
报错根因
MySQL的LIMIT子句只接受不带引号的整数值作为合法参数。当前代码的参数绑定逻辑默认将URL传入的rc.limit识别为字符串类型,最终实际执行的SQL为SELECT * FROM TABLE_NAME LIMIT '25',分页数值被单引号包裹,和报错提示中near ''25''的异常位置完全对应,直接触发语法错误。
修复方案
- 显式指定绑定参数的类型为整数,让JDBC驱动按整数类型传参,不会给值额外包裹单引号:
queryExecute( "SELECT * FROM TABLE_NAME LIMIT :limit", { limit: { value: rc.limit, cfsqltype: "cf_sql_integer" } } );
- 提前对传入的分页参数做整数强转和合法性校验,确认参数为合法正整数后再传入查询,从源头避免类型错误,同时拦截非法传参:
// 强制将传入值转为整数,设置默认分页大小,过滤非正整数的非法输入 rc.limit = val(rc.limit) > 0 ? val(rc.limit) : 20; // 经过强转的值为纯整数类型,直接拼接不存在SQL注入风险 queryExecute("SELECT * FROM TABLE_NAME LIMIT #rc.limit#");
注意:如果分页逻辑同时使用OFFSET参数,参数化时也需要指定为整数类型,否则会出现完全相同的语法报错。
内容的提问来源于stack exchange,提问作者Undecided Dev
相关产品推荐
相关产品推荐

