mysql - MySQL和MariaDB之间的用户定义变量分配区别
问题描述
当然,我们之前已经完成了我们的工作,并在这个社区或网络上搜索过类似的帖子,但我们一无所获。
问题:
我们对当前的托管服务提供商不满意,必须做出改变。在我们的数据库从 MySQL 5.7 切换到 MariaDB 10.3 的过程中,我们发现了 SET 处理的差异,这在 MySQL 中非常有效。
SQL 代码:
SET @sb = 0;
SELECT art,sb
FROM ARTICLE
WHERE(@sb:=sb) > 700 AND @sb <= 1000 >AND art = 'AM';
MySQL结果:
艺术 | 某人 |
---|---|
是 | 900.00 |
是 | 960.00 |
是 | 1000.00 |
是 | 770.00 |
是 | 800.00 |
清单要长得多…… |
MariaDB 结果:
艺术 | 某人 |
---|---|
是 | 770.00 |
是 | 960.00 |
是 | 1200.00 |
是 | 3000.00 |
只有10行... |
事实上,它们之间是有区别的。
但我们想知道:
- 我们可以在 MariaDB 中配置它,以便在 MySQL 中得到相同的结果吗?
- 我们应该用另一个替换 MariaDB 中的 Set 处理吗?
解决方案
不,这是不可能的。
事实上,MySQL 文档警告在 SQL 语句中使用变量赋值:
涉及用户变量的表达式的求值顺序未定义。例如,不能保证先
SELECT @a, @a:=@a+1
求值@a
再执行赋值。
更重要的是,这是一个可能被删除的“功能”:
MySQL 的早期版本使得在 SET 以外的语句中为用户变量赋值成为可能。MySQL 8.0 支持此功能以实现向后兼容性,但在 MySQL 的未来版本中可能会被删除。
所以你不应该依赖它,并重写你的查询。
推荐阅读
- python - 在 Docker 容器中运行的 Python 脚本未将文件保存到正确的路径
- java - 获取在集合中排序的唯一文档
- gradle - Gradle - 命令行中的每个
- python - TypeError:pandas 列中需要一个整数
- java - 将外部 Jar 中的 orm xml 加载到 Spring Boot 中
- jquery - XMLHttpRequest 适用于 Chrome+Edge,但不适用于 Firefox
- python - exec() 为类方法范围变量分配一个新值
- list - 编写一个函数,它吃一个 Nat 并返回一个 (listof Nat),其中包含 1 和 n 之间的数字,这些数字可以被 2、3 和 5 中的一个整除
- node.js - AWS X-Ray 与 Node.JS Express 和请求
- c# - 如何使用mysql删除额外的行