📣

TiDB Cloud Serverless 现已更名为
Starter
!此页面由 AI 自动翻译,英文原文请见
此处。

用户定义变量

本文档描述了 TiDB 中用户定义变量的概念以及设置和读取用户定义变量的方法。

用户定义变量的格式为 @var_name。组成 var_name 的字符可以是任何可以组成标识符的字符,包括数字 0-9、字母 a-zA-Z、下划线 _、美元符号 $ 和 UTF-8 字符。此外,还包括英文句点 .。用户定义变量不区分大小写。

用户定义变量是会话相关的,这意味着由一个客户端连接定义的用户变量,其他客户端连接无法看到或使用。

设置用户定义变量

你可以使用 SET 语句 来设置用户定义变量,语法为 SET @var_name = expr [, @var_name = expr] ...;。例如:

SET @favorite_db = 'TiDB';
SET @a = 'a', @b = 'b', @c = 'c';

对于赋值操作符,也可以使用 :=。例如:

SET @favorite_db := 'TiDB';

赋值符号右侧的内容可以是任何有效的表达式。例如:

SET @c = @a + @b;
SET @c = b'1000001' + b'1000001';

读取用户定义变量

要读取用户定义变量,可以使用 SELECT 语句进行查询:

SELECT @a1, @a2, @a3
+------+------+------+ | @a1 | @a2 | @a3 | +------+------+------+ | 1 | 2 | 4 | +------+------+------+

也可以在 SELECT 语句中赋值:

SELECT @a1, @a2, @a3, @a4 := @a1+@a2+@a3;
+------+------+------+--------------------+ | @a1 | @a2 | @a3 | @a4 := @a1+@a2+@a3 | +------+------+------+--------------------+ | 1 | 2 | 4 | 7 | +------+------+------+--------------------+

在变量 @a4 被修改或连接关闭之前,其值始终为 7

如果在设置用户定义变量时使用十六进制字面量或二进制字面量,TiDB 会将其视为二进制字符串。如果你想将其设置为数字,可以手动添加 CAST 转换,或者在表达式中使用数字运算符:

SET @v1 = b'1000001'; SET @v2 = b'1000001'+0; SET @v3 = CAST(b'1000001' AS UNSIGNED);
SELECT @v1, @v2, @v3;
+------+------+------+ | @v1 | @v2 | @v3 | +------+------+------+ | A | 65 | 65 | +------+------+------+

如果你引用了未初始化的用户定义变量,它的值为 NULL,类型为字符串。

SELECT @not_exist;
+------------+ | @not_exist | +------------+ | NULL | +------------+

除了使用 SELECT 语句读取用户定义变量外,另一种常用方式是 PREPARE 语句。例如:

SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; PREPARE stmt FROM @s; SET @a = 6; SET @b = 8; EXECUTE stmt USING @a, @b;
+------------+ | hypotenuse | +------------+ | 10 | +------------+

用户定义变量的内容在 SQL 语句中不会被识别为标识符。例如:

SELECT * from t;
+---+ | a | +---+ | 1 | +---+
SET @col = "`a`"; SELECT @col FROM t;
+------+ | @col | +------+ | `a` | +------+

MySQL 兼容性

除了 SELECT ... INTO <variable> 之外,MySQL 和 TiDB 支持的语法是相同的。

更多信息请参见 User-Defined Variables in MySQL

文档内容是否有帮助?