MySQL 变量

2025年8月19日 | 阅读 6 分钟

变量用于在程序执行期间存储数据或信息。它是为数据贴上适当名称的标签,有助于读者更清晰地理解程序。变量的主要目的是将数据存储在内存中,并在整个程序中使用。

MySQL 可以以三种不同的方式使用变量,如下所示:

  1. 用户定义变量
  2. 局部变量
  3. 系统变量

用户定义变量

有时,我们希望将值从一个语句传递到另一个语句。用户定义变量使我们能够在一个语句中存储一个值,以后可以在另一个语句中引用它。MySQL 提供 SETSELECT 语句来声明和初始化变量。用户定义变量名以 @ 符号开头。

用户定义变量不区分大小写,例如 @name 和 @NAME;它们是相同的。一个人声明的用户定义变量不能被另一个人看到。我们可以将用户定义变量赋值给有限的数据类型,如整数、浮点数、十进制数、字符串或 NULL。用户定义变量的最大长度为64 个字符

语法

以下语法用于声明用户定义变量:

1. 使用 SET 语句

注意:我们可以使用 '=' 或 ':=' 赋值运算符与 SET 语句一起使用。

2. 使用 SELECT 语句

示例 1

在这里,我们将使用 SET 语句将值赋给变量。

然后,我们可以使用 SELECT 语句显示上述值。

输出

MySQL Variables

示例 2

让我们在 MySQL 数据库中创建 students 表,如下所示:

MySQL Variables

运行以下语句以获取 'students' 表中学生的最高年龄,并将年龄赋值给用户定义变量 @maxage

它将产生以下输出:

MySQL Variables

现在,运行使用 @maxage 变量返回学生最高年龄的 SELECT 语句。

成功执行上述语句后,我们将得到以下结果:

MySQL Variables

Example3

如果我们访问未声明的变量,它将给出 NULL 输出。

输出

MySQL Variables

局部变量

它是一种不带 @ 符号前缀的变量。局部变量是强类型变量。局部变量的作用域在声明它的存储程序块中。MySQL 使用 DECLARE 关键字来指定局部变量。DECLARE 语句还结合了 DEFAULT 子句为变量提供默认值。如果您不提供 DEFAULT 子句,它将给出初始值 NULL。它主要用于存储过程程序。

语法

我们可以使用以下语法使用 DECLARE 语句:

让我们看下面的例子来使用局部变量。

示例

我们也可以使用单个 DECLARE 语句定义两个或多个具有相同数据类型的变量。

下面的例子解释了如何在存储过程中使用 DECLARE 语句。

成功执行上述函数后,按如下方式调用存储过程函数:

它将提供以下输出

MySQL Variables

系统变量

系统变量是所有程序单元的一个特殊类,其中包含预定义的变量。MySQL 包含各种配置其操作的系统变量,每个系统变量都包含一个默认值。我们可以使用 SET 语句在运行时动态更改某些系统变量。它使我们能够在不停止和重新启动服务器的情况下修改服务器操作。系统变量也可以在表达式中使用。

MySQL 服务器提供了一系列系统变量,如 GLOBAL、SESSION 或 MIX 类型。我们可以在服务器的整个生命周期中看到 GLOBAL 变量,而 SESSION 变量仅在特定会话中保持活动状态。

我们可以通过以下方式查看系统变量的名称和值:

1. 要查看正在运行的服务器使用的当前值,请执行以下命令。

2. 当我们想查看基于其编译时默认值的值时,请使用以下命令。

示例 1

输出

MySQL Variables

示例 2

输出

MySQL Variables

使用 MySQL 变量的最佳方法

  1. 使用清晰且描述性的名称:变量的预期用途应始终反映在其名称中。避免使用太短或不明确的名称,因为这可能会使读者感到困惑并使调试更加困难。具有有意义名称的代码库更易于阅读,尤其是在共享或大型代码库中。
  2. 识别变量作用域:确定变量是全局的、基于会话的还是局部的。局部变量仅存在于存储程序中。全局变量有影响,而所有会话变量在连接之间保持不变。通过使用适当的作用域,可以避免不必要的副作用。
  3. 不应重复使用变量名:脚本或过程如果重复使用相同的变量名,可能会导致逻辑冲突。保持准确性和清晰度的最佳方法是为每个任务声明不同的变量。
  4. 应在使用前初始化变量:未初始化的局部变量可能会包含意外的值。在每次执行开始时赋值,以避免错误的计算或逻辑错误。
  5. 如果需要,可以重置会话变量:由于它们在整个会话中保留其值,因此可以使用用户定义变量来避免陈旧数据问题,方法是在重用之前覆盖或重置它们。
  6. 使用临时逻辑时,请勿更改全局变量。由于它们可能影响所有用户,因此此类更改应保留用于系统范围的配置。

常见问题

1. 什么是 MySQL 变量?为什么使用它们?

在执行查询或会话时,数据会存储在 MySQL 变量中。它们允许开发人员存储值以供后续处理或计算。动态数据可减少查询重复,简化逻辑,并在处理变量时提供灵活性。

2. 用户定义变量与会话全局变量有何区别?

以 @ 开头的用户定义变量是会话特定的,并且在连接关闭之前一直可用。会话变量(例如 @@SESSION.sql_mode)仅影响活动会话的行为。所有新会话都受全局变量(例如 @@GLOBAL.max_connections)的影响,这些变量适用于整个 MySQL 服务器。虽然全局变量也是 MySQL 配置系统的一个组成部分,但用户定义变量通常用于查询或脚本中以存储临时会话数据。

3. 我可以在不同地方使用相同的变量名吗?

虽然不推荐,但在理论上可以多次使用相同的变量名。当同一个变量名用于多个目的时,尤其是在存储过程中,可能会导致误解和错误。最好使用描述性和唯一的名称,以提高可读性并避免逻辑冲突。

4. 变量在查询或会话期间会保留其值吗?

用户定义变量和会话变量仅在会话期间保留其值。当连接断开时,它们的值将丢失。在MySQL 8 中,全局变量不使用 SET PERSIST 进行持久化。在服务器重新启动之前,它们将保持在 0 或更低。局部变量在存储过程完成后将被删除。

5. 如何安全地将查询中的值赋给变量?

可以使用 SELECT ... INTO 语法将查询中的值赋给变量,但要确保查询只返回一行。如果返回零行,变量将设置为 NULL;如果返回多行,则会引发错误。必须仔细管理此行为,以避免逻辑故障,尤其是在生产环境中。


下一主题如何安装 MySQL