首页 > 解决方案 > 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行...

事实上,它们之间是有区别的。

但我们想知道:

  1. 我们可以在 MariaDB 中配置它,以便在 MySQL 中得到相同的结果吗?
  2. 我们应该用另一个替换 MariaDB 中的 Set 处理吗?

标签: mysqlsqlmariadb

解决方案


不,这是不可能的。

事实上,MySQL 文档警告在 SQL 语句中使用变量赋值:

涉及用户变量的表达式的求值顺序未定义。例如,不能保证先SELECT @a, @a:=@a+1求值@a再执行赋值。

更重要的是,这是一个可能被删除的“功能”:

MySQL 的早期版本使得在 SET 以外的语句中为用户变量赋值成为可能。MySQL 8.0 支持此功能以实现向后兼容性,但在 MySQL 的未来版本中可能会被删除。

所以你不应该依赖它,并重写你的查询。


推荐阅读