【多选题】以下哪些场景下的常量在 SQL 参数化时不能被转换为参数?

以下哪些场景下的常量在 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 :white_check_mark: 不能参数化

ORDER BY 数字 代表按查询结果第N列排序,这个数字属于语法标识(列序号),不是普通字段值。
不能写成 ORDER BY ?,?,预编译会语法报错。

B. LIMIT 10 中的10 :x: 可以参数化

主流数据库(MySQL、PostgreSQL等)支持 LIMIT ?,行数属于数值常量,是合法参数。

C. DATE_FORMAT(now(), ‘%Y-%m-%d’) 中的格式串 :white_check_mark: 不能参数化

DATE_FORMAT 的格式化模板字符串属于函数的格式定义文本,绝大多数数据库不允许用占位符传入格式模板。
DATE_FORMAT(now(), ?) 运行会报错。

D. WHERE id BETWEEN 100 AND 200 :x: 可以参数化

条件里的数值是字段比较值,标准参数写法:id BETWEEN ? AND ?

1 个赞