mysql order by 如何自定义列?

2021-08-27 03:26:06 +08:00
 wunonglin
SELECT a, b, c, d FROM table ORDER BY a DESC;

order by 是动态的根据传入的 a,b,c,d 带进去的。

我从 orm 插入后是个字符串.....

SELECT a, b, c, d FROM table ORDER BY 'a' DESC;
2752 次点击
所在节点    MySQL
13 条回复
ooh
2021-08-27 04:14:15 +08:00
啥语言 哪个 orm 库
Variazioni
2021-08-27 07:33:25 +08:00
写法取决于你用的 orm 库
strawberryBug
2021-08-27 07:43:14 +08:00
入参做了严格检验的话,字段可以用 sql 注入
qping
2021-08-27 07:44:11 +08:00
java mybatis 的话是 ${} 和 #{} 的区别
Oktfolio
2021-08-27 08:54:23 +08:00
直接拼接上去,不要用 preparedstatement 噢,注意限制字段
vindac
2021-08-27 08:54:42 +08:00
字符串拼接
opengps
2021-08-27 09:00:36 +08:00
整个查询语句包裹一层,然后后重新使用 order by 对别名列排序
NutChocHoney
2021-08-27 09:09:10 +08:00
mybatis 的话 用#{}就会有这个问题
passerbytiny
2021-08-27 09:13:50 +08:00
order by 后面的列,只能是拼接 SQL 拼接上去,不能用预编译后再设置参数。
wunonglin
2021-08-27 09:39:40 +08:00
golang 的 gorm,用?拼上去的。

好像看来只能用拼字符串了。会不会出现注入问题啊
acr0ss
2021-08-27 11:19:21 +08:00
从官方文档来看: https://dev.mysql.com/doc/refman/8.0/en/select.html

[ORDER BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]

这里 order by 只接收 3 种形式:
1. 字段名,包含 alias ; 支持用`包裹,例如 `a`;
2. expr 表达式,例如 concat(a, b)
3. position,数字引用,例如 1,表示第一个 select 字段。

就目前问题描述来看,如果 SQL 是最终执行的语句,会解析为第二种。
即所有行的表达式都是常量 'a',这个 order by 等于无效。
Jooooooooo
2021-08-27 13:11:23 +08:00
拼一下

注意注入, 不要让外部传入这个拼的东西, 或者内部做校验
zlujackie
2021-08-29 12:18:50 +08:00
@vindac

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/798242

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX