This is a read-only copy of the MariaDB Knowledgebase generated on 2024-12-24. For the latest, interactive version please visit https://mariadb.com/kb/.

用户变量(User-Defined Variables)

Contents

  1. See Also

用户变量是指由用户创建,并存在于会话当中的变量。这意味着其他用户无法访问,且在当前会话关闭时,该用户变量自动过期。但是,这些变量可以在多个查询和存储程序stored programs之间共享使用。

用户变量的名称前必须加上单个at符号作为前缀(@)。用户变量的名称部分可以安全地使用保留关键词,名称部分所允许的字符包括ASCII字母、数字、美元符($)、下划线(_)和点(.)。如果要使用其他字符,需要使用以下几种引用方式包围它:

  • @`var_name`
  • @'var_name'
  • @"var_name"

这些字符可以进行正常的转义(逃逸)。

现在用户变量是不区分大小写的,但在MySQL 4.1和更老的版本中是区分大小写的。

用户变量是无法声明的。可以直接读取一个存在或不存在的用户变量,只不过不存在的用户变量返回值为NULL。要设置一个用户变量,可以使用以下几种方式:

由于无法声明用户变量的类型,唯一能够强制它们类型的方式是使用CAST()CONVERT()进行转换:

SET @str = CAST(123 AS CHAR(5));

如果变量未赋值,则其值为NULL:

SELECT @x IS NULL;
+------------+
| @x IS NULL |
+------------+
|          1 |
+------------+

在同一个语句中同时读取变量、设置变量的值是不安全的行为(除非使用的是SET命令),因为这些操作的顺序是不定的。

用户变量可以用在绝大多数可以接受SQL表达式的MariaDB语句和子句中。但是有一些例外,例如LIMIT子句。

用户变量不能替代语句中的关键字、标识符等,除非它们用在预编译PREPARE语句中。(译者注:英文版内容缺失,此句为本人自行修改。例如@a="SELECT",却无法@a * from t。正如下面的例子中,如果用户变量@sql不在PREPARE语句中进行预编译,它无法直接执行)

@sql = 'DELETE FROM my_table WHERE c>1;';
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

另一个较常用的功能是在查询语句中充当计数器:

SET @var = 0;
SELECT a, b, c, (@var:=@var+1) AS counter FROM my_table;

See Also

Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.