以下哪些场景下的常量在 SQL 参数化时不能被转换为参数?
A. ORDER BY 1, 2 中的 1, 2
B. LIMIT 10 中的 10
C. DATE_FORMAT(now(), ‘%Y-%m-%d’) 中的 ‘%Y-%m-%d’
D. WHERE id BETWEEN 100 AND 200 中的 100, 200
2 个赞
答案:A、C
核心原理
SQL 参数(预编译占位符 ?)只能用于【值】;
不能充当:列名、表名、排序序号、函数格式符、关键字、运算符、分区名等语法结构组成部分。
A. ORDER BY 1,2 里的 1、2
不能参数化
ORDER BY 数字 代表按查询结果第N列排序,这个数字属于语法标识(列序号),不是普通字段值。
不能写成 ORDER BY ?,?,预编译会语法报错。
B. LIMIT 10 中的10
可以参数化
主流数据库(MySQL、PostgreSQL等)支持 LIMIT ?,行数属于数值常量,是合法参数。
C. DATE_FORMAT(now(), ‘%Y-%m-%d’) 中的格式串
不能参数化
DATE_FORMAT 的格式化模板字符串属于函数的格式定义文本,绝大多数数据库不允许用占位符传入格式模板。
DATE_FORMAT(now(), ?) 运行会报错。
D. WHERE id BETWEEN 100 AND 200
可以参数化
条件里的数值是字段比较值,标准参数写法:id BETWEEN ? AND ?。
1 个赞